From b35105f81f862100c274cd5899cb53244168560f Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 14 Aug 2020 00:47:50 +0200 Subject: ... --- .../wyrd/v1/compiler/fate/v1/Compiler.java | 10 +-- .../v1/compiler/fate/v1/ComputationCompiler.java | 12 ++- .../v1/compiler/fate/v1/InstructionCompiler.java | 14 ++-- .../wyrd/v1/compiler/fate/v1/MacroManager.java | 92 ---------------------- .../wyrd/v1/compiler/fate/v1/TypeCompiler.java | 8 +- .../compiler/util/registers/RegisterContext.java | 25 +++--- .../compiler/util/registers/RegisterManager.java | 33 +++++--- .../util/registers/StackableRegisterContext.java | 32 +++++--- src/core/src/tonkadur/wyrd/v1/lang/Register.java | 19 +++-- 9 files changed, 86 insertions(+), 159 deletions(-) delete mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java index c88b8be..5c64cd5 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java @@ -1,8 +1,10 @@ package tonkadur.wyrd.v1.compiler.fate.v1; -import tonkadur.wyrd.v1.compiler.util.RegisterManager; +import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; import tonkadur.wyrd.v1.compiler.util.InstructionManager; +import tonkadur.wyrd.v1.lang.type.DictType; + import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.World; @@ -41,7 +43,6 @@ public class Compiler { this.wyrd_world = wyrd_world; - macro_manager = new MacroManager(); registers = new RegisterManager(); assembler = new InstructionManager(); } @@ -146,9 +147,4 @@ public class Compiler { return assembler; } - - public MacroManager macros () - { - return macro_manager; - } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index ac24ae7..7d92f21 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -1,9 +1,10 @@ package tonkadur.wyrd.v1.compiler.fate.v1; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Iterator; -import java.util.ArrayList; +import java.util.List; import tonkadur.error.Error; @@ -637,7 +638,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor new Size(collection_compiler.get_address()), collection_compiler.get_address(), result_as_address, - index.get_address(); + index.get_address() ) ); @@ -1355,10 +1356,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor final Register register; register = - compiler.registers().get_register - ( - n.get_variable().get_name() - ); + compiler.registers().get_context_register(n.get_variable().get_name()); result_as_address = register.get_address(); result_as_computation = register.get_value(); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 04a7bcd..a138417 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -814,7 +814,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor end_of_loop_label = compiler.assembler().generate_label(""); compiler.assembler().push_context_label("breakable", end_of_loop_label); - compiler.registers().bind(current_value, n.get_parameter_name()); + compiler.registers().bind(n.get_parameter_name(), current_value); new_body.add ( @@ -1413,7 +1413,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor collection = collection_cc.get_address(); - result.add(new SetValue(collection_size, new Size(collection))); + result.add + ( + new SetValue(collection_size.get_address(), new Size(collection)) + ); if ( @@ -1563,13 +1566,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor elem = elem_cc.get_address(); collection = collection_cc.get_address(); - result.add(new SetValue(elem.get_address(), elem_cc.get_computation())); result.add ( new SetValue(collection_size.get_address(), new Size(collection)) ); - elem_cc.release_registers(); if ( @@ -1610,8 +1611,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ); } - compiler.registers().release(elem); - result.add ( If.generate @@ -1624,7 +1623,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers(), compiler.assembler(), index.get_address(), - value_of_collection_size, + collection_size.get_value(), collection ) ) @@ -1634,6 +1633,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers().release(found); compiler.registers().release(collection_size); + elem_cc.release_registers(); collection_cc.release_registers(); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java deleted file mode 100644 index e471f28..0000000 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java +++ /dev/null @@ -1,92 +0,0 @@ -package tonkadur.wyrd.v1.compiler.fate.v1; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -import tonkadur.wyrd.v1.lang.computation.Address; - -public class MacroManager -{ - protected final Map wild_parameters; - protected final Stack> context_stack; - - public MacroManager () - { - wild_parameters = new HashMap(); - context_stack = new Stack>(); - } - - public void add_wild_parameter (final String name, final Address ref) - { - if (wild_parameters.containsKey(name)) - { - System.err.println("[P] duplicate wild parameter '" + name + "'."); - - return; - } - - wild_parameters.put(name, ref); - } - - public void remove_wild_parameter (final String name) - { - wild_parameters.remove(name); - } - - public void pop () - { - context_stack.pop(); - } - - public void push - ( - final tonkadur.fate.v1.lang.Macro macro, - final List
parameter_refs - ) - { - final Iterator
pri; - final Iterator pre; - final Map parameters; - - parameters = new HashMap(); - - pri = parameter_refs.iterator(); - pre = macro.get_parameters().get_entries().iterator(); - - while (pri.hasNext()) - { - final String name; - - name = pre.next().get_name(); - - parameters.put(name, pri.next()); - } - - context_stack.push(parameters); - } - - public Address get_parameter_ref (final String parameter) - { - Address result; - - result = wild_parameters.get(parameter); - - if (result == null) - { - if (!context_stack.isEmpty()) - { - result = context_stack.peek().get(parameter); - } - - if (result == null) - { - System.err.println("[P] No such parameter '" + parameter + "'."); - } - } - - return result; - } -} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java index b433002..7013e1e 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java @@ -42,7 +42,7 @@ public class TypeCompiler ); } - if (fate_type instanceof tonkadur.fate.v1.lang.type.AddressType) + if (fate_type instanceof tonkadur.fate.v1.lang.type.PointerType) { return new PointerType @@ -51,7 +51,7 @@ public class TypeCompiler ( compiler, ( - (tonkadur.fate.v1.lang.type.AddressType) + (tonkadur.fate.v1.lang.type.PointerType) fate_type ).get_referenced_type() ) @@ -166,7 +166,7 @@ public class TypeCompiler return MapType.MAP_TO_RICH_TEXT; } - if (fate_content_type instanceof tonkadur.fate.v1.lang.type.AddressType) + if (fate_content_type instanceof tonkadur.fate.v1.lang.type.PointerType) { return new MapType @@ -177,7 +177,7 @@ public class TypeCompiler ( compiler, ( - (tonkadur.fate.v1.lang.type.AddressType) + (tonkadur.fate.v1.lang.type.PointerType) fate_content_type ).get_referenced_type() ) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java index 1689231..3c45e83 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java @@ -16,7 +16,7 @@ class RegisterContext protected final String name; protected final Map register_by_name; protected final Map aliased_registers; - protected final Map anonymous_register_by_type; + protected final Map> anonymous_register_by_type; protected int generated_registers; public RegisterContext (final String name) @@ -25,7 +25,7 @@ class RegisterContext register_by_name = new HashMap(); aliased_registers = new HashMap(); - anonymous_register_by_type = new HashMap(); + anonymous_register_by_type = new HashMap>(); generated_registers = 0; } @@ -50,9 +50,9 @@ class RegisterContext anonymous_register_by_type.put(t, list); } - for (final register r: list) + for (final Register r: list) { - if (!entry.get_is_in_use()) + if (!r.get_is_in_use()) { r.set_is_in_use(true); @@ -62,7 +62,7 @@ class RegisterContext name = (name_prefix + Integer.toString(generated_registers++)); - result = create_register(t, "local", name); + result = create_register(t, name); result.set_is_in_use(true); @@ -73,11 +73,11 @@ class RegisterContext return result; } - public Register reserve (final Type t, final String scope, final String name) + public Register reserve (final Type t, final String name) { final Register result; - result = create_register(t, scope, name); + result = create_register(t, name); if (register_by_name.get(name) != null) { @@ -96,7 +96,7 @@ class RegisterContext return result; } - public void bind (final Register reg, final String name) + public void bind (final String name, final Register reg) { if (aliased_registers.containsKey(name)) { @@ -137,13 +137,8 @@ class RegisterContext r.set_is_in_use(false); } - protected Register create_register - ( - final Type t, - final String scope, - final String name - ) + protected Register create_register (final Type t, final String name) { - return new Register(t, scope, name); + return new Register(t, name); } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java index dffb52a..88f3eeb 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -1,21 +1,25 @@ package tonkadur.wyrd.v1.compiler.util.registers; -import java.util.Map; -import java.util.HashMap; +import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Collection; +import java.util.Deque; +import java.util.HashMap; import java.util.List; -import java.util.ArrayList; +import java.util.Map; import tonkadur.functional.Cons; import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.computation.Address; import tonkadur.wyrd.v1.lang.computation.Constant; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.DictType; public class RegisterManager @@ -30,7 +34,7 @@ public class RegisterManager { base_context = new RegisterContext("base context"); - context_by_name = new HashMap(); + context_by_name = new HashMap(); context = new ArrayDeque(); created_contexts = 0; @@ -39,7 +43,7 @@ public class RegisterManager public Register reserve (final Type t) { - context.peekFirst().reserve(t); + return context.peekFirst().reserve(t); } public void release (final Register r) @@ -56,14 +60,19 @@ public class RegisterManager { final StackableRegisterContext result; - result = StackableRegisterContext.generate(base_context, context_name); + result = new StackableRegisterContext(base_context, context_name); + + if (context_by_name.containsKey(context_name)) + { + System.err.println("[P] Duplicate context '" + context_name +"'."); + } - context_by_name.put(result); + context_by_name.put(context_name, result); } - public void register (final Type t, final String register_name) + public Register register (final Type t, final String name) { - context.peekFirst().reserve(t, name); + return context.peekFirst().reserve(t, name); } public void bind (final String name, final Register register) @@ -76,7 +85,7 @@ public class RegisterManager context.peekFirst().unbind(name); } - public Register get_context_register (final String register_name) + public Register get_context_register (final String name) { final Register result; @@ -110,9 +119,9 @@ public class RegisterManager { final Collection result; - result = new ArrayList(); + result = new ArrayList(); - for (final StackableRegisterContext src: register_by_name.values()) + for (final StackableRegisterContext src: context_by_name.values()) { result.add(src.get_structure_type()); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java index 193315b..e8f79a8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java @@ -8,14 +8,20 @@ import java.util.ArrayList; import tonkadur.functional.Cons; -import tonkadur.wyrd.v1.lang.Variable; +import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Cast; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.PointerType; +import tonkadur.wyrd.v1.lang.type.MapType; +import tonkadur.wyrd.v1.lang.type.DictType; class StackableRegisterContext extends RegisterContext @@ -55,16 +61,11 @@ class StackableRegisterContext extends RegisterContext } @Override - protected Register generate_register - ( - final Type t, - final String scope, - final String name - ) + protected Register create_register (final Type t, final String name) { final Register result; - if (context_structure.get(name) != null) + if (context_structure.get_fields().get(name) != null) { System.err.println ( @@ -76,7 +77,7 @@ class StackableRegisterContext extends RegisterContext ); } - context_structure.put(name, t); + context_structure.get_fields().put(name, t); return new Register @@ -88,11 +89,22 @@ class StackableRegisterContext extends RegisterContext t ), t, - scope, name ); } + public List get_enter_instructions () + { + /* TODO */ + return new ArrayList<>(); + } + + public List get_leave_instructions () + { + /* TODO */ + return new ArrayList<>(); + } + public DictType get_structure_type () { return context_structure; diff --git a/src/core/src/tonkadur/wyrd/v1/lang/Register.java b/src/core/src/tonkadur/wyrd/v1/lang/Register.java index 4f1c671..4dfbf23 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/Register.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/Register.java @@ -10,35 +10,34 @@ import tonkadur.wyrd.v1.lang.meta.Computation; public class Register { protected final Type type; - protected final String scope; protected final String name; protected final Address address; protected final Computation value; + protected boolean is_in_use; - public Register (final Type type, final String scope, final String name) + public Register (final Type type, final String name) { this.name = name; - this.scope = scope; this.type = type; address = new Address(new Constant(Type.STRING, name), type); value = new ValueOf(address); + is_in_use = false; } public Register ( final Address address, final Type type, - final String scope, final String name ) { this.address = address; this.name = name; - this.scope = scope; this.type = type; value = new ValueOf(address); + is_in_use = false; } public Type get_type () @@ -65,4 +64,14 @@ public class Register { return value; } + + public boolean get_is_in_use () + { + return is_in_use; + } + + public void set_is_in_use (final boolean val) + { + is_in_use = val; + } } -- cgit v1.2.3-70-g09d2