From 51cd83bf0dcf2e147d7b14e755a96133eaa9c767 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Tue, 8 Sep 2020 11:31:46 +0200 Subject: It compiles, but doesn't work properly. Structure initialization can't work with this: if it was initialized as an int then used later as a struct, none of the struct's fields are there, so writting to them is not doable. There might be a way, using `remove` and `initialize` to refresh the register at every use. This would kill the side-channel attack used to pass parameters, and so special care would have to be taken for them. --- .../wyrd/v1/compiler/fate/v1/Compiler.java | 2 - .../compiler/util/registers/RegisterContext.java | 35 ++++------- .../compiler/util/registers/RegisterManager.java | 4 +- .../util/registers/StackableRegisterContext.java | 16 +----- src/core/src/tonkadur/wyrd/v1/lang/Register.java | 67 ++++++++++++++-------- 5 files changed, 60 insertions(+), 64 deletions(-) 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 3b57ff3..4dc56d6 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 @@ -107,8 +107,6 @@ public class Compiler t = TypeCompiler.compile(this, variable.get_type()); r = registers.register(t, variable.get_name()); - - r.set_is_in_use(true); } this.assembler().handle_adding_instruction 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 c0d70a3..24ec2eb 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 @@ -23,7 +23,7 @@ class RegisterContext protected final Map register_by_name; protected final Map aliased_registers; protected final Deque> hierarchical_aliases; - protected final Map> anonymous_register_by_type; + protected final List anonymous_registers; protected final String name_prefix; protected int generated_registers; @@ -34,7 +34,7 @@ class RegisterContext register_by_name = new HashMap(); aliased_registers = new HashMap(); hierarchical_aliases = new ArrayDeque>(); - anonymous_register_by_type = new HashMap>(); + anonymous_registers = new ArrayList(); name_prefix = default_name_prefix; generated_registers = 0; @@ -46,7 +46,7 @@ class RegisterContext register_by_name = new HashMap(); aliased_registers = new HashMap(); - anonymous_register_by_type = new HashMap>(); + anonymous_registers = new ArrayList(); hierarchical_aliases = new ArrayDeque>(); this.name_prefix = name_prefix; @@ -71,22 +71,12 @@ class RegisterContext { final String name; final Register result; - List list; - list = anonymous_register_by_type.get(t); - - if (list == null) - { - list = new ArrayList(); - - anonymous_register_by_type.put(t, list); - } - - for (final Register r: list) + for (final Register r: anonymous_registers) { - if (!r.get_is_in_use()) + if (!r.is_active()) { - r.set_is_in_use(true); + r.activate(t); return r; } @@ -96,9 +86,7 @@ class RegisterContext result = create_register(t, name, initialize_holder); - result.set_is_in_use(true); - - list.add(result); + anonymous_registers.add(result); register_by_name.put(name, result); @@ -128,8 +116,6 @@ class RegisterContext register_by_name.put(name, result); - result.set_is_in_use(true); - return result; } @@ -158,7 +144,9 @@ class RegisterContext public void unbind (final String name) { release(aliased_registers.get(name)); + aliased_registers.remove(name); + if (!hierarchical_aliases.isEmpty()) { hierarchical_aliases.peekFirst().remove(name); @@ -199,7 +187,7 @@ class RegisterContext public void release (final Register r) { - r.set_is_in_use(false); + r.deactivate(); } protected Register create_register @@ -211,7 +199,8 @@ class RegisterContext { final Register result; - result = new Register(t, name); + result = new Register(name); + result.activate(t); initialize_holder.add(new Initialize(result.get_address(), t)); 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 07ea1ac..da5b063 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 @@ -335,7 +335,7 @@ public class RegisterManager for (final Register r: used_registers) { /* Side-channel attack to pass parameters, because it's convenient. */ - r.set_is_in_use(false); + r.deactivate(); } return result; @@ -363,7 +363,7 @@ public class RegisterManager for (final Register r: used_registers) { /* Side-channel attack to pass parameters, because it's convenient. */ - r.set_is_in_use(false); + r.deactivate(); } return result; 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 8731d8c..5f38107 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 @@ -102,20 +102,10 @@ class StackableRegisterContext extends RegisterContext ); } - context_structure.get_fields().put(name, t); + context_structure.get_fields().put(name, Type.INT); - result = - new Register - ( - new RelativeAddress - ( - current_context_address, - new Constant(Type.STRING, name), - t - ), - t, - name - ); + result = new Register(current_context_address, name); + result.activate(t); /* No need for this: it's part of the type. */ //initialize_holder.add(new Initialize(result.get_address(), t)); diff --git a/src/core/src/tonkadur/wyrd/v1/lang/Register.java b/src/core/src/tonkadur/wyrd/v1/lang/Register.java index cefe711..7d87c21 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/Register.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/Register.java @@ -4,46 +4,42 @@ import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.lang.computation.Constant; import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; import tonkadur.wyrd.v1.lang.computation.ValueOf; import tonkadur.wyrd.v1.lang.meta.Computation; public class Register { - protected final Type type; protected final String name; - protected final Address address; - protected final Computation value; - protected boolean is_in_use; + protected final Address address_prefix; + protected Address address; + protected Computation value; + protected Type current_type; - public Register (final Type type, final String name) + public Register (final String name) { this.name = name; - this.type = type; - address = new Address(new Constant(Type.STRING, name), type); - value = new ValueOf(address); - is_in_use = false; + address_prefix = null; + address = null; + value = null; + current_type = Type.INT; } - public Register - ( - final Address address, - final Type type, - final String name - ) + public Register (final Address address_prefix, final String name) { - this.address = address; + this.address_prefix = address_prefix; this.name = name; - this.type = type; - value = new ValueOf(address); - is_in_use = false; + address = null; + value = null; + current_type = Type.INT; } public Type get_type () { - return type; + return current_type; } public String get_name () @@ -61,13 +57,36 @@ public class Register return value; } - public boolean get_is_in_use () + public boolean is_active () + { + return (address != null); + } + + public void activate (final Type type) { - return is_in_use; + this.current_type = type; + + if (address_prefix == null) + { + address = new Address(new Constant(Type.STRING, name), type); + } + else + { + address = + new RelativeAddress + ( + address_prefix, + new Constant(Type.STRING, name), + type + ); + } + + value = new ValueOf(address); } - public void set_is_in_use (final boolean val) + public void deactivate () { - is_in_use = val; + address = null; + value = null; } } -- cgit v1.2.3-70-g09d2 From 7d8ad25fb295d64c33f39273bc61b004a1bdb2af Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Tue, 8 Sep 2020 12:52:30 +0200 Subject: It's going to be a considerable change... --- .../wyrd/v1/compiler/fate/v1/Compiler.java | 2 +- .../wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 6 -- .../compiler/util/registers/RegisterContext.java | 34 +++++----- .../compiler/util/registers/RegisterManager.java | 72 ++++++++++------------ .../util/registers/StackableRegisterContext.java | 48 +++------------ .../src/tonkadur/wyrd/v1/lang/type/MapType.java | 2 + src/core/src/tonkadur/wyrd/v1/lang/type/Type.java | 2 + 7 files changed, 66 insertions(+), 100 deletions(-) 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 4dc56d6..9dca78b 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 @@ -34,7 +34,7 @@ public class Compiler compiler.assembler().handle_adding_instruction ( - compiler.assembler().merge(compiler.registers().pop_initializes()), + compiler.assembler().merge(compiler.registers().get_initialization()), wyrd_world ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 16f7ec0..16c5eae 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -118,12 +118,6 @@ public class SequenceCompiler compiler.registers().pop_context(); - compiler.assembler().handle_adding_instruction - ( - compiler.assembler().merge(compiler.registers().pop_initializes()), - compiler.world() - ); - compiler.assembler().handle_adding_instruction ( compiler.assembler().mark_after 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 24ec2eb..e335374 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 @@ -15,6 +15,7 @@ import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.lang.instruction.Initialize; +import tonkadur.wyrd.v1.lang.instruction.Remove; class RegisterContext { @@ -78,13 +79,17 @@ class RegisterContext { r.activate(t); + initialize_holder.add(new Initialize(r.get_address(), t)); + return r; } } name = (name_prefix + Integer.toString(generated_registers++)); - result = create_register(t, name, initialize_holder); + result = create_register(t, name); + + initialize_holder.add(new Initialize(result.get_address(), t)); anonymous_registers.add(result); @@ -102,7 +107,7 @@ class RegisterContext { final Register result; - result = create_register(t, name, initialize_holder); + result = create_register(t, name); if (register_by_name.get(name) != null) { @@ -114,6 +119,8 @@ class RegisterContext ); } + initialize_holder.add(new Initialize(result.get_address(), t)); + register_by_name.put(name, result); return result; @@ -141,9 +148,9 @@ class RegisterContext } } - public void unbind (final String name) + public void unbind (final String name, final List instr_holder) { - release(aliased_registers.get(name)); + release(aliased_registers.get(name), instr_holder); aliased_registers.remove(name); @@ -158,11 +165,14 @@ class RegisterContext hierarchical_aliases.push(new ArrayList()); } - public void pop_hierarchical_instruction_level () + public void pop_hierarchical_instruction_level + ( + final List instr_holder + ) { for (final String s: hierarchical_aliases.pop()) { - unbind(s); + unbind(s, instr_holder); } } @@ -185,25 +195,19 @@ class RegisterContext return register_by_name.get(name); } - public void release (final Register r) + public void release (final Register r, final List instr_holder) { + instr_holder.add(new Remove(r.get_address())); r.deactivate(); } - protected Register create_register - ( - final Type t, - final String name, - final List initialize_holder - ) + protected Register create_register (final Type t, final String name) { final Register result; result = new Register(name); result.activate(t); - initialize_holder.add(new Initialize(result.get_address(), t)); - return result; } 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 da5b063..9593eaf 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 @@ -40,7 +40,7 @@ public class RegisterManager protected final RegisterContext base_context, parameter_context; protected final Register next_pc, pc_stack; protected final Register choice_number, rand_mode, rand_value; - protected List awaiting_inits; + protected final List awaiting_inits; protected int created_contexts; public RegisterManager () @@ -64,14 +64,14 @@ public class RegisterManager context.push(base_context); } - public Register reserve (final Type t) + public Register reserve (final Type t, final List instr_holder) { - return context.peekFirst().reserve(t, awaiting_inits); + return context.peekFirst().reserve(t, instr_holder); } - public void release (final Register r) + public void release (final Register r, final List instr_holder) { - context.peekFirst().release(r); + context.peekFirst().release(r, instr_holder); } public String create_stackable_context_name () @@ -94,7 +94,11 @@ public class RegisterManager return rand_value; } - public void create_stackable_context (final String context_name) + public void create_stackable_context + ( + final String context_name, + final List instr_holder + ) { final StackableRegisterContext result; @@ -103,7 +107,7 @@ public class RegisterManager ( base_context, context_name, - awaiting_inits + instr_holder ); if (context_by_name.containsKey(context_name)) @@ -138,9 +142,14 @@ public class RegisterManager context.pop(); } - public Register register (final Type t, final String name) + public Register register + ( + final Type t, + final String name, + final List instr_holder + ) { - return context.peekFirst().reserve(t, name, awaiting_inits); + return context.peekFirst().reserve(t, name, instr_holder); } public void bind (final String name, final Register register) @@ -148,9 +157,9 @@ public class RegisterManager context.peekFirst().bind(name, register); } - public void unbind (final String name) + public void unbind (final String name, final List instr_holder) { - context.peekFirst().unbind(name); + context.peekFirst().unbind(name, instr_holder); } public Register get_context_register (final String name) @@ -289,23 +298,12 @@ public class RegisterManager context.peekFirst().push_hierarchical_instruction_level(); } - public void pop_hierarchical_instruction_level () - { - context.peekFirst().pop_hierarchical_instruction_level(); - } - - public Collection get_context_structure_types () + public void pop_hierarchical_instruction_level + ( + final List instr_holder + ) { - final Collection result; - - result = new ArrayList(); - - for (final StackableRegisterContext src: context_by_name.values()) - { - result.add(src.get_structure_type()); - } - - return result; + context.peekFirst().pop_hierarchical_instruction_level(instr_holder); } public Collection get_base_registers () @@ -325,7 +323,7 @@ public class RegisterManager { final Register r; - r = parameter_context.reserve(p.get_type(), awaiting_inits); + r = parameter_context.reserve(p.get_type(), result); result.add(new SetValue(r.get_address(), p)); @@ -336,6 +334,8 @@ public class RegisterManager { /* Side-channel attack to pass parameters, because it's convenient. */ r.deactivate(); + // Do not use the context to deactivate here, otherwise the value will + // be removed. } return result; @@ -345,15 +345,17 @@ public class RegisterManager { final List used_registers; final List result; + final List ignored_inits; used_registers = new ArrayList(); result = new ArrayList(); + ignored_inits = new ArrayList(); for (final Register p: params) { final Register r; - r = parameter_context.reserve(p.get_type(), awaiting_inits); + r = parameter_context.reserve(p.get_type(), ignored_inits); result.add(new SetValue(p.get_address(), r.get_value())); @@ -363,20 +365,14 @@ public class RegisterManager for (final Register r: used_registers) { /* Side-channel attack to pass parameters, because it's convenient. */ - r.deactivate(); + parameter_context.release(r, result); } return result; } - public List pop_initializes () + public List get_initialization () { - final List result; - - result = awaiting_inits; - - awaiting_inits = new ArrayList(); - - return result; + return awaiting_inits; } } 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 5f38107..0ceaa4f 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 @@ -1,7 +1,5 @@ package tonkadur.wyrd.v1.compiler.util.registers; -import java.util.Map; -import java.util.HashMap; import java.util.Collection; import java.util.List; import java.util.ArrayList; @@ -28,14 +26,11 @@ import tonkadur.wyrd.v1.lang.instruction.Initialize; 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 { - protected final Map context_structure_fields; protected final RegisterContext base_context; - protected final DictType context_structure; protected final Register context_stack_level; protected final Register context_stacks; protected final Address current_context_address_holder; @@ -52,15 +47,11 @@ class StackableRegisterContext extends RegisterContext this.base_context = base_context; - context_structure_fields = new HashMap(); - - context_structure = new DictType(context_name, context_structure_fields); - context_stack_level = base_context.reserve(Type.INT, initialize_holder); context_stacks = base_context.reserve ( - new MapType(new PointerType(context_structure)), + new MapType(new PointerType(MapType.MAP_TO_ANY)), initialize_holder ); @@ -69,45 +60,27 @@ class StackableRegisterContext extends RegisterContext ( context_stacks.get_address(), new Cast(context_stack_level.get_value(), Type.STRING), - new PointerType(context_structure) + new PointerType(MapType.MAP_TO_ANY) ); current_context_address = new Address ( new ValueOf(current_context_address_holder), - context_structure + MapType.MAP_TO_ANY ); } @Override - protected Register create_register - ( - final Type t, - final String name, - final List initialize_holder - ) + protected Register create_register (final Type t, final String name) { final Register result; - if (context_structure.get_fields().get(name) != null) - { - System.err.println - ( - "[P] Duplicate register '" - + name - + "' in stackable context " - + this.name - + "." - ); - } - - context_structure.get_fields().put(name, Type.INT); - result = new Register(current_context_address, name); + result.activate(t); - /* No need for this: it's part of the type. */ + /* Handled elsewhere */ //initialize_holder.add(new Initialize(result.get_address(), t)); return result; @@ -133,7 +106,7 @@ class StackableRegisterContext extends RegisterContext new Initialize ( current_context_address_holder, - new PointerType(context_structure) + new PointerType(MapType.MAP_TO_ANY) ) ); @@ -142,7 +115,7 @@ class StackableRegisterContext extends RegisterContext new SetValue ( current_context_address_holder, - new New(context_structure) + new New(MapType.MAP_TO_ANY) ) ); @@ -170,9 +143,4 @@ class StackableRegisterContext extends RegisterContext return result; } - - public DictType get_structure_type () - { - return context_structure; - } } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java index c9586ee..7773fac 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java @@ -7,6 +7,7 @@ public class MapType extends Type public static final MapType MAP_TO_INT; public static final MapType MAP_TO_STRING; public static final MapType MAP_TO_RICH_TEXT; + public static final MapType MAP_TO_ANY; static { @@ -15,6 +16,7 @@ public class MapType extends Type MAP_TO_INT = new MapType(Type.INT); MAP_TO_RICH_TEXT = new MapType(Type.RICH_TEXT); MAP_TO_STRING = new MapType(Type.STRING); + MAP_TO_ANY = new MapType(Type.ANY); } /***************************************************************************/ diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java index d123104..6f87094 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java @@ -7,6 +7,7 @@ public class Type public static final Type INT; public static final Type RICH_TEXT; public static final Type STRING; + public static final Type ANY; static { @@ -15,6 +16,7 @@ public class Type INT = new Type("int"); RICH_TEXT = new Type("rich_text"); STRING = new Type("string"); + ANY = new Type("any"); } /***************************************************************************/ -- cgit v1.2.3-70-g09d2 From 59d05224a5831b19668b879a9fe46bfc08dc0784 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Tue, 8 Sep 2020 14:33:01 +0200 Subject: Still has issues with removing already removed registers. Looks to be related to context registers being removed after the context register holder itself was already removed. --- .../wyrd/v1/compiler/fate/v1/Compiler.java | 22 +-- .../v1/compiler/fate/v1/ComputationCompiler.java | 22 ++- .../v1/compiler/fate/v1/InstructionCompiler.java | 179 +++++++++++---------- .../wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 52 +++--- .../wyrd/v1/compiler/util/BinarySearch.java | 12 +- .../src/tonkadur/wyrd/v1/compiler/util/Clear.java | 7 +- .../wyrd/v1/compiler/util/CountOccurrences.java | 4 +- .../tonkadur/wyrd/v1/compiler/util/InsertAt.java | 8 +- .../wyrd/v1/compiler/util/RemoveAllOf.java | 12 +- .../tonkadur/wyrd/v1/compiler/util/RemoveAt.java | 8 +- .../wyrd/v1/compiler/util/ReverseList.java | 12 +- .../compiler/util/registers/RegisterContext.java | 24 ++- .../compiler/util/registers/RegisterManager.java | 4 + .../util/registers/StackableRegisterContext.java | 11 +- .../src/tonkadur/wyrd/v1/lang/type/DictType.java | 8 + .../src/tonkadur/wyrd/v1/lang/type/MapType.java | 2 - src/core/src/tonkadur/wyrd/v1/lang/type/Type.java | 2 - 17 files changed, 212 insertions(+), 177 deletions(-) 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 9dca78b..d246012 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 @@ -42,11 +42,9 @@ public class Compiler compiler.compile_types(fate_world); compiler.compile_variables(fate_world); - compiler.compile_sequences(fate_world); - compiler.compile_main_sequence(fate_world); - compiler.add_registers(); + compiler.compile_sequences(fate_world); return compiler.wyrd_world; } @@ -106,7 +104,8 @@ public class Compiler final Register r; t = TypeCompiler.compile(this, variable.get_type()); - r = registers.register(t, variable.get_name()); + r = registers.register(t, variable.get_name(), init_instr); + wyrd_world.add_register(r); } this.assembler().handle_adding_instruction @@ -144,21 +143,6 @@ public class Compiler fate_world.get_global_instructions() ); } - - protected void add_registers () - throws Throwable - { - for (final DictType type: registers.get_context_structure_types()) - { - wyrd_world.add_dict_type(type); - } - - for (final Register register: registers.get_base_registers()) - { - wyrd_world.add_register(register); - } - } - public World world () { return wyrd_world; 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 996a246..312fa47 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 @@ -111,11 +111,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor } } - public void release_registers () + public void release_registers (final List instr_holder) { for (final Register reg: reserved_registers) { - compiler.registers().release(reg); + compiler.registers().release(reg, instr_holder); } } @@ -129,7 +129,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor { final Register result; - result = compiler.registers().reserve(t); + result = compiler.registers().reserve(t, init_instructions); reserved_registers.add(result); @@ -1632,7 +1632,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor context_name = compiler.registers().create_stackable_context_name(); - compiler.registers().create_stackable_context(context_name); + compiler.registers().create_stackable_context + ( + context_name, + init_instructions + ); init_instructions.addAll ( @@ -1796,7 +1800,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor final ComputationCompiler cc; name = a.get_car().get_name(); - r = reserve(TypeCompiler.compile(compiler, a.get_car().get_type())); + r = + /* These are free by the unbind below */ + compiler.registers().reserve + ( + TypeCompiler.compile(compiler, a.get_car().get_type()), + init_instructions + ); compiler.registers().bind(name, r); names.add(name); @@ -1817,7 +1827,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor for (final String name: names) { - compiler.registers().unbind(name); + compiler.registers().unbind(name, init_instructions); } } 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 67a7e0d..0dfe2bb 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 @@ -119,9 +119,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor collection = address_compiler.get_address(); - element_found = compiler.registers().reserve(Type.BOOL); - element_index = compiler.registers().reserve(Type.INT); - collection_size = compiler.registers().reserve(Type.INT); + element_found = compiler.registers().reserve(Type.BOOL, result); + element_index = compiler.registers().reserve(Type.INT, result); + collection_size = compiler.registers().reserve(Type.INT, result); result.add ( @@ -161,12 +161,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - compiler.registers().release(element_found); - compiler.registers().release(element_index); - compiler.registers().release(collection_size); + compiler.registers().release(element_found, result); + compiler.registers().release(element_index, result); + compiler.registers().release(collection_size, result); - element_compiler.release_registers(); - address_compiler.release_registers(); + element_compiler.release_registers(result); + address_compiler.release_registers(result); } protected void add_element_to_list @@ -249,8 +249,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - address_compiler.release_registers(); - element_compiler.release_registers(); + address_compiler.release_registers(result); + element_compiler.release_registers(result); } @Override @@ -265,7 +265,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor r = compiler.registers().reserve ( - TypeCompiler.compile(compiler, n.get_variable().get_type()) + TypeCompiler.compile(compiler, n.get_variable().get_type()), + result ); compiler.registers().bind(n.get_variable().get_name(), r); @@ -325,7 +326,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor final ComputationCompiler collection_compiler; final Register index_holder; - index_holder = compiler.registers().reserve(Type.INT); + index_holder = compiler.registers().reserve(Type.INT, result); index_compiler = new ComputationCompiler(compiler); @@ -386,11 +387,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - compiler.registers().release(index_holder); + compiler.registers().release(index_holder, result); - index_compiler.release_registers(); - element_compiler.release_registers(); - collection_compiler.release_registers(); + index_compiler.release_registers(result); + element_compiler.release_registers(result); + collection_compiler.release_registers(result); } @Override @@ -465,8 +466,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor new Assert(cond_cc.get_computation(), msg_cc.get_computation()) ); - cond_cc.release_registers(); - msg_cc.release_registers(); + cond_cc.release_registers(result); + msg_cc.release_registers(result); } @Override @@ -503,7 +504,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - address_compiler.release_registers(); + address_compiler.release_registers(result); } public void visit_reverse_list @@ -542,7 +543,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - address_compiler.release_registers(); + address_compiler.release_registers(result); } @Override @@ -601,7 +602,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers().push_hierarchical_instruction_level(); n.get_default_instruction().get_visited_by(ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(ic.result); previous_else_branch.add(ic.get_result()); @@ -639,7 +640,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor branch.get_car().get_visited_by(cc); compiler.registers().push_hierarchical_instruction_level(); branch.get_cdr().get_visited_by(ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(ic.result); if (cc.has_init()) { @@ -660,7 +661,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor previous_else_branch = current_branch; - cc.release_registers(); + cc.release_registers(result); } result.add(compiler.assembler().merge(previous_else_branch)); @@ -688,7 +689,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor result.add(new Display(cc.get_computation())); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -721,7 +722,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor result.add(new Remove(target)); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -751,7 +752,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor body.add(ic.get_result()); } - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(body); if (cc.has_init()) @@ -791,7 +792,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } compiler.assembler().pop_context_label("breakable"); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -821,7 +822,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor pre_cond_instructions.add(ic.get_result()); } - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level + ( + pre_cond_instructions + ); if (cc.has_init()) { @@ -849,7 +853,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ); compiler.assembler().pop_context_label("breakable"); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -881,7 +885,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor body.add(ic.get_result()); } - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(body); ic = new InstructionCompiler(compiler); n.get_post().get_visited_by(ic); @@ -928,7 +932,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } compiler.assembler().pop_context_label("breakable"); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -956,8 +960,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor cc = new ComputationCompiler(compiler); new_body = new ArrayList(); - index = compiler.registers().reserve(Type.INT); - collection_size = compiler.registers().reserve(Type.INT); + index = compiler.registers().reserve(Type.INT, result); + collection_size = compiler.registers().reserve(Type.INT, result); result.add(new SetValue(index.get_address(), Constant.ZERO)); @@ -977,7 +981,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor member_type = ((MapType) collection.get_target_type()).get_member_type(); - current_value = compiler.registers().reserve(member_type); + current_value = compiler.registers().reserve(member_type, result); end_of_loop_label = compiler.assembler().generate_label(""); @@ -1015,7 +1019,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor new_body.add(ic.get_result()); } - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(new_body); new_body.add ( @@ -1044,12 +1048,14 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor end_of_loop_label ) ); - compiler.registers().unbind(n.get_parameter_name()); + compiler.registers().unbind(n.get_parameter_name(), result); compiler.assembler().pop_context_label("breakable"); - compiler.registers().release(index); - compiler.registers().release(current_value); - compiler.registers().release(collection_size); + compiler.registers().release(index, result); + compiler.registers().release(collection_size, result); + + /* Already released by the unbind above. */ + /* compiler.registers().release(current_value, result); */ } @Override @@ -1066,7 +1072,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor index_cc = new ComputationCompiler(compiler); collection_cc = new ComputationCompiler(compiler); - collection_size = compiler.registers().reserve(Type.INT); + collection_size = compiler.registers().reserve(Type.INT, result); n.get_index().get_visited_by(index_cc); n.get_collection().get_visited_by(collection_cc); @@ -1102,10 +1108,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - compiler.registers().release(collection_size); + compiler.registers().release(collection_size, result); - index_cc.release_registers(); - collection_cc.release_registers(); + index_cc.release_registers(result); + collection_cc.release_registers(result); } @@ -1183,7 +1189,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor branch.get_car().get_visited_by(cc); compiler.registers().push_hierarchical_instruction_level(); branch.get_cdr().get_visited_by(ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(ic.result); if (cc.has_init()) { @@ -1204,7 +1210,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor previous_else_branch = current_branch; - cc.release_registers(); + cc.release_registers(result); } result.add(compiler.assembler().merge(previous_else_branch)); @@ -1254,7 +1260,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor for (final ComputationCompiler cc: cc_list) { - cc.release_registers(); + cc.release_registers(result); } } @@ -1282,11 +1288,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers().push_hierarchical_instruction_level(); n.get_if_true().get_visited_by(if_true_ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level + ( + if_true_ic.result + ); compiler.registers().push_hierarchical_instruction_level(); n.get_if_false().get_visited_by(if_false_ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level + ( + if_false_ic.result + ); if (cc.has_init()) { @@ -1305,7 +1317,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -1330,7 +1342,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.registers().push_hierarchical_instruction_level(); n.get_if_true().get_visited_by(if_true_ic); - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level + ( + if_true_ic.result + ); if (cc.has_init()) { @@ -1348,7 +1363,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -1552,7 +1567,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor { fate_instruction.get_visited_by(this); } - compiler.registers().pop_hierarchical_instruction_level(); + compiler.registers().pop_hierarchical_instruction_level(result); result.add ( @@ -1566,7 +1581,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - cc.release_registers(); + cc.release_registers(result); } @Override @@ -1706,7 +1721,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor elem_cc = new ComputationCompiler(compiler); collection_cc = new ComputationCompiler(compiler); - collection_size = compiler.registers().reserve(Type.INT); + collection_size = compiler.registers().reserve(Type.INT, result); n.get_element().get_visited_by(elem_cc); n.get_collection().get_visited_by(collection_cc); @@ -1742,8 +1757,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor final Computation value_of_elem; final Register index, found; - index = compiler.registers().reserve(Type.INT); - found = compiler.registers().reserve(Type.BOOL); + index = compiler.registers().reserve(Type.INT, result); + found = compiler.registers().reserve(Type.BOOL, result); value_of_elem = new ValueOf(elem); @@ -1761,7 +1776,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - elem_cc.release_registers(); + elem_cc.release_registers(result); result.add ( @@ -1781,8 +1796,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - compiler.registers().release(index); - compiler.registers().release(found); + compiler.registers().release(index, result); + compiler.registers().release(found, result); } else { @@ -1798,12 +1813,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - elem_cc.release_registers(); + elem_cc.release_registers(result); } - collection_cc.release_registers(); + collection_cc.release_registers(result); - compiler.registers().release(collection_size); + compiler.registers().release(collection_size, result); } @Override @@ -1857,9 +1872,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor elem_cc = new ComputationCompiler(compiler); collection_cc = new ComputationCompiler(compiler); - collection_size = compiler.registers().reserve(Type.INT); - found = compiler.registers().reserve(Type.BOOL); - index = compiler.registers().reserve(Type.INT); + collection_size = compiler.registers().reserve(Type.INT, result); + found = compiler.registers().reserve(Type.BOOL, result); + index = compiler.registers().reserve(Type.INT, result); n.get_element().get_visited_by(elem_cc); n.get_collection().get_visited_by(collection_cc); @@ -1942,12 +1957,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - compiler.registers().release(index); - compiler.registers().release(found); - compiler.registers().release(collection_size); + compiler.registers().release(index, result); + compiler.registers().release(found, result); + compiler.registers().release(collection_size, result); - elem_cc.release_registers(); - collection_cc.release_registers(); + elem_cc.release_registers(result); + collection_cc.release_registers(result); } @Override @@ -2013,7 +2028,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor for (final ComputationCompiler cc: parameter_ccs) { - cc.release_registers(); + cc.release_registers(result); } } @@ -2073,7 +2088,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor for (final ComputationCompiler cc: parameter_ccs) { - cc.release_registers(); + cc.release_registers(result); } } @@ -2112,8 +2127,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor new SetValue(address_cc.get_address(), value_cc.get_computation()) ); - value_cc.release_registers(); - address_cc.release_registers(); + value_cc.release_registers(result); + address_cc.release_registers(result); } @Override @@ -2173,10 +2188,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - target_cc.release_registers(); - min_cc.release_registers(); - max_cc.release_registers(); - label_cc.release_registers(); + target_cc.release_registers(result); + min_cc.release_registers(result); + max_cc.release_registers(result); + label_cc.release_registers(result); } @Override @@ -2236,9 +2251,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - target_cc.release_registers(); - min_cc.release_registers(); - max_cc.release_registers(); - label_cc.release_registers(); + target_cc.release_registers(result); + min_cc.release_registers(result); + max_cc.release_registers(result); + label_cc.release_registers(result); } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 16c5eae..5403ca6 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -24,19 +24,17 @@ public class SequenceCompiler ) throws Throwable { - final List init_instructions; + final List init_instructions, pre_init; final List parameters; final List to_be_cleaned; - final String end_of_sequence; final InstructionCompiler ic; init_instructions = new ArrayList(); + pre_init = new ArrayList(); parameters = new ArrayList(); to_be_cleaned = new ArrayList(); ic = new InstructionCompiler(compiler); - end_of_sequence = compiler.assembler().generate_label(""); - compiler.world().add_sequence_label ( fate_sequence.get_name(), @@ -47,25 +45,26 @@ public class SequenceCompiler compiler.registers().create_stackable_context ( - fate_sequence.get_name() + fate_sequence.get_name(), + pre_init ); init_instructions.add ( - new SetPC(compiler.assembler().get_label_constant(end_of_sequence)) + compiler.assembler().mark + ( + fate_sequence.get_name(), + compiler.assembler().merge(pre_init) + ) ); init_instructions.add ( - compiler.assembler().mark + compiler.assembler().merge ( - fate_sequence.get_name(), - compiler.assembler().merge + compiler.registers().get_initialize_context_instructions ( - compiler.registers().get_initialize_context_instructions - ( - fate_sequence.get_name() - ) + fate_sequence.get_name() ) ) ); @@ -83,7 +82,8 @@ public class SequenceCompiler r = compiler.registers().reserve ( - TypeCompiler.compile(compiler, param.get_type()) + TypeCompiler.compile(compiler, param.get_type()), + init_instructions ); parameters.add(r); @@ -97,10 +97,16 @@ public class SequenceCompiler compiler.registers().read_parameters(parameters) ); + fate_sequence.get_root().get_visited_by(ic); init_instructions.add(ic.get_result()); + for (final Register r: to_be_cleaned) + { + compiler.registers().release(r, init_instructions); + } + init_instructions.addAll ( compiler.registers().get_finalize_context_instructions() @@ -111,20 +117,11 @@ public class SequenceCompiler compiler.registers().get_leave_context_instructions() ); - for (final Register r: to_be_cleaned) - { - compiler.registers().release(r); - } - compiler.registers().pop_context(); compiler.assembler().handle_adding_instruction ( - compiler.assembler().mark_after - ( - compiler.assembler().merge(init_instructions), - end_of_sequence - ), + compiler.assembler().merge(init_instructions), compiler.world() ); } @@ -158,13 +155,6 @@ public class SequenceCompiler { fate_instruction.get_visited_by(ic); } - - compiler.assembler().handle_adding_instruction - ( - compiler.assembler().merge(compiler.registers().pop_initializes()), - compiler.world() - ); - compiler.assembler().handle_adding_instruction ( ic.get_result(), diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java index b08a376..44106bf 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java @@ -98,9 +98,9 @@ public class BinarySearch element_type = target.get_type(); - bot = registers.reserve(Type.INT); - top = registers.reserve(Type.INT); - midval = registers.reserve(element_type); + bot = registers.reserve(Type.INT, result); + top = registers.reserve(Type.INT, result); + midval = registers.reserve(element_type, result); value_of_result_index = new ValueOf(result_index); @@ -257,9 +257,9 @@ public class BinarySearch ) ); - registers.release(bot); - registers.release(top); - registers.release(midval); + registers.release(bot, result); + registers.release(top, result); + registers.release(midval, result); return assembler.merge(result); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java index cb0929c..c5137c2 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java @@ -41,6 +41,9 @@ public class Clear * (set .iterator (- (val .iterator) 1)) * (remove collection[.iterator]) * ) + * FIXME: this can now be written as + * (remove collection) + * (initialize collection) */ public static Instruction generate ( @@ -60,7 +63,7 @@ public class Clear element_type = ((MapType) collection.get_target_type()).get_member_type(); - iterator = registers.reserve(Type.INT); + iterator = registers.reserve(Type.INT, result); /* (set .iterator collection_size) */ result.add(new SetValue(iterator.get_address(), collection_size)); @@ -100,7 +103,7 @@ public class Clear ) ); - registers.release(iterator); + registers.release(iterator, result); return assembler.merge(result); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java index 5fb9fce..11a928f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java @@ -66,7 +66,7 @@ public class CountOccurrences target_type = target.get_type(); - index = registers.reserve(Type.INT); + index = registers.reserve(Type.INT, result); result.add(new SetValue(count, Constant.ZERO)); result.add(new SetValue(index.get_address(), collection_size)); @@ -117,6 +117,8 @@ public class CountOccurrences ) ); + registers.release(index, result); + return assembler.merge(result); } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java index 12e4658..71c4bc1 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java @@ -69,8 +69,8 @@ public class InsertAt element_type = element.get_type(); - prev = registers.reserve(Type.INT); - end = registers.reserve(Type.INT); + prev = registers.reserve(Type.INT, result); + end = registers.reserve(Type.INT, result); value_of_index = new ValueOf(index); @@ -166,8 +166,8 @@ public class InsertAt ) ); - registers.release(end); - registers.release(prev); + registers.release(end, result); + registers.release(prev, result); return assembler.merge(result); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java index e8daadf..50cef0a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java @@ -87,9 +87,9 @@ public class RemoveAllOf element_type = element.get_type(); - index = registers.reserve(Type.INT); - found = registers.reserve(Type.INT); - end = registers.reserve(Type.INT); + index = registers.reserve(Type.INT, result); + found = registers.reserve(Type.INT, result); + end = registers.reserve(Type.INT, result); value_of_found_greater_than_0 = Operation.greater_than(found.get_value(), Constant.ZERO); @@ -248,9 +248,9 @@ public class RemoveAllOf ) ); - registers.release(index); - registers.release(found); - registers.release(end); + registers.release(index, result); + registers.release(found, result); + registers.release(end, result); return assembler.merge(result); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java index d540d67..222738f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java @@ -68,8 +68,8 @@ public class RemoveAt element_type = ((MapType) collection.get_target_type()).get_member_type(); - next = registers.reserve(Type.INT); - end = registers.reserve(Type.INT); + next = registers.reserve(Type.INT, result); + end = registers.reserve(Type.INT, result); value_of_index = new ValueOf(index); @@ -143,8 +143,8 @@ public class RemoveAt /* (remove collection[index]) */ result.add(new Remove(collection_at_index)); - registers.release(end); - registers.release(next); + registers.release(end, result); + registers.release(next, result); return assembler.merge(result); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java index 2d5e269..f044cd9 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java @@ -66,9 +66,9 @@ public class ReverseList element_type = ((MapType) collection.get_target_type()).get_member_type(); - buffer = registers.reserve(element_type); - top = registers.reserve(Type.INT); - bot = registers.reserve(Type.INT); + buffer = registers.reserve(element_type, result); + top = registers.reserve(Type.INT, result); + bot = registers.reserve(Type.INT, result); collection_at_top = new RelativeAddress @@ -158,9 +158,9 @@ public class ReverseList ) ); - registers.release(buffer); - registers.release(top); - registers.release(bot); + registers.release(buffer, result); + registers.release(top, result); + registers.release(bot, result); return assembler.merge(result); } 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 e335374..e83707b 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 @@ -192,11 +192,33 @@ class RegisterContext public Register get_non_local_register (final String name) { - return register_by_name.get(name); + final Register result; + + result = register_by_name.get(name); + + if (result == null) + { + System.err.println("[F] Access to unknown global register: " + name); + } + else if (!result.is_active()) + { + System.err.println("[P] Inactive global register: " + name); + } + + return result; } public void release (final Register r, final List instr_holder) { + if (!r.is_active()) + { + System.err.println + ( + "[W][P] Deactivating inactive register: " + + r.get_name() + ); + new Throwable().printStackTrace(); + } instr_holder.add(new Remove(r.get_address())); r.deactivate(); } 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 9593eaf..2d12e0a 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 @@ -172,6 +172,10 @@ public class RegisterManager { return base_context.get_non_local_register(name); } + else if (!result.is_active()) + { + System.err.println("[P] Inactive context register: " + name); + } return result; } 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 0ceaa4f..449a1ee 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 @@ -24,6 +24,7 @@ import tonkadur.wyrd.v1.lang.instruction.Remove; import tonkadur.wyrd.v1.lang.instruction.Initialize; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.DictType; import tonkadur.wyrd.v1.lang.type.PointerType; import tonkadur.wyrd.v1.lang.type.MapType; @@ -51,7 +52,7 @@ class StackableRegisterContext extends RegisterContext context_stacks = base_context.reserve ( - new MapType(new PointerType(MapType.MAP_TO_ANY)), + new MapType(new PointerType(DictType.WILD)), initialize_holder ); @@ -60,14 +61,14 @@ class StackableRegisterContext extends RegisterContext ( context_stacks.get_address(), new Cast(context_stack_level.get_value(), Type.STRING), - new PointerType(MapType.MAP_TO_ANY) + new PointerType(DictType.WILD) ); current_context_address = new Address ( new ValueOf(current_context_address_holder), - MapType.MAP_TO_ANY + DictType.WILD ); } @@ -106,7 +107,7 @@ class StackableRegisterContext extends RegisterContext new Initialize ( current_context_address_holder, - new PointerType(MapType.MAP_TO_ANY) + new PointerType(DictType.WILD) ) ); @@ -115,7 +116,7 @@ class StackableRegisterContext extends RegisterContext new SetValue ( current_context_address_holder, - new New(MapType.MAP_TO_ANY) + new New(DictType.WILD) ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java index 239fa0c..b5ea5aa 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java @@ -1,9 +1,17 @@ package tonkadur.wyrd.v1.lang.type; import java.util.Map; +import java.util.HashMap; public class DictType extends Type { + public static final DictType WILD; + + static + { + WILD = new DictType("wild dict", new HashMap()); + } + protected Map fields; public DictType (final String name, final Map fields) diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java index 7773fac..c9586ee 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java @@ -7,7 +7,6 @@ public class MapType extends Type public static final MapType MAP_TO_INT; public static final MapType MAP_TO_STRING; public static final MapType MAP_TO_RICH_TEXT; - public static final MapType MAP_TO_ANY; static { @@ -16,7 +15,6 @@ public class MapType extends Type MAP_TO_INT = new MapType(Type.INT); MAP_TO_RICH_TEXT = new MapType(Type.RICH_TEXT); MAP_TO_STRING = new MapType(Type.STRING); - MAP_TO_ANY = new MapType(Type.ANY); } /***************************************************************************/ diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java index 6f87094..d123104 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java @@ -7,7 +7,6 @@ public class Type public static final Type INT; public static final Type RICH_TEXT; public static final Type STRING; - public static final Type ANY; static { @@ -16,7 +15,6 @@ public class Type INT = new Type("int"); RICH_TEXT = new Type("rich_text"); STRING = new Type("string"); - ANY = new Type("any"); } /***************************************************************************/ -- cgit v1.2.3-70-g09d2 From 0abb01e4fcc043dd428e53e8bf21e97831d54ab8 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Tue, 8 Sep 2020 17:03:16 +0200 Subject: Got it to work, I think... --- .../wyrd/v1/compiler/fate/v1/Compiler.java | 4 +- .../v1/compiler/fate/v1/ComputationCompiler.java | 52 ++++++++++++++++------ .../v1/compiler/fate/v1/InstructionCompiler.java | 10 ++--- .../wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 43 +++++++++++++----- .../util/registers/StackableRegisterContext.java | 6 +++ 5 files changed, 83 insertions(+), 32 deletions(-) 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 d246012..79004b2 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 @@ -42,10 +42,10 @@ public class Compiler compiler.compile_types(fate_world); compiler.compile_variables(fate_world); - compiler.compile_main_sequence(fate_world); - compiler.compile_sequences(fate_world); + compiler.compile_main_sequence(fate_world); + return compiler.wyrd_world; } 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 312fa47..d031b66 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 @@ -1619,15 +1619,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor out_label = compiler.assembler().generate_label(""); in_label = compiler.assembler().generate_label(""); - init_instructions.add - ( - compiler.assembler().mark_after - ( - new SetPC(compiler.assembler().get_label_constant(out_label)), - in_label - ) - ); - parameters = new ArrayList(); context_name = compiler.registers().create_stackable_context_name(); @@ -1638,6 +1629,15 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor init_instructions ); + init_instructions.add + ( + compiler.assembler().mark_after + ( + new SetPC(compiler.assembler().get_label_constant(out_label)), + in_label + ) + ); + init_instructions.addAll ( compiler.registers().get_initialize_context_instructions(context_name) @@ -1648,7 +1648,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor result_type = TypeCompiler.compile(compiler, n.get_lambda_function().get_type()); - result_holder = reserve(new PointerType(result_type)); + result_holder = + /* Defining a context, don't use this.reserve(), otherwise this + * context-dependent variable will get released outside the context + * (where it doesn't exist) and that will cause an error. + */ + compiler.registers().reserve + ( + new PointerType(result_type), + init_instructions + ); parameters.add(result_holder); @@ -1656,7 +1665,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor { final Register r; - r = reserve(TypeCompiler.compile(compiler, param.get_type())); + r = + /* Bound registers, can't use this.reserve() */ + compiler.registers().reserve + ( + TypeCompiler.compile(compiler, param.get_type()), + init_instructions + ); parameters.add(r); @@ -1672,7 +1687,12 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor n.get_lambda_function().get_visited_by(expr_compiler); - assimilate(expr_compiler); + /* Nope: its variables are removed when the context is left. */ + /* assimilate(expr_compiler); */ + if (expr_compiler.has_init()) + { + init_instructions.add(expr_compiler.get_init()); + } init_instructions.add ( @@ -1682,7 +1702,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor expr_compiler.get_computation() ) ); - +/* + * No need: it's getting finalized anyway. + for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters()) + { + compiler.registers().unbind(param.get_name(), init_instructions); + } +*/ init_instructions.addAll ( compiler.registers().get_finalize_context_instructions() 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 0dfe2bb..769f2c0 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 @@ -2069,6 +2069,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor result.addAll(compiler.registers().store_parameters(parameters)); + for (final ComputationCompiler cc: parameter_ccs) + { + cc.release_registers(result); + } + /* Terminate current context */ result.addAll ( @@ -2085,11 +2090,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ) ); - - for (final ComputationCompiler cc: parameter_ccs) - { - cc.release_registers(result); - } } @Override diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 5403ca6..6f3a83d 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -24,17 +24,19 @@ public class SequenceCompiler ) throws Throwable { - final List init_instructions, pre_init; + final List init_instructions; final List parameters; + final String end_of_sequence; final List to_be_cleaned; final InstructionCompiler ic; init_instructions = new ArrayList(); - pre_init = new ArrayList(); parameters = new ArrayList(); to_be_cleaned = new ArrayList(); ic = new InstructionCompiler(compiler); + end_of_sequence = compiler.assembler().generate_label(""); + compiler.world().add_sequence_label ( fate_sequence.get_name(), @@ -46,25 +48,27 @@ public class SequenceCompiler compiler.registers().create_stackable_context ( fate_sequence.get_name(), - pre_init + init_instructions ); init_instructions.add ( - compiler.assembler().mark - ( - fate_sequence.get_name(), - compiler.assembler().merge(pre_init) - ) + new SetPC(compiler.assembler().get_label_constant(end_of_sequence)) ); + System.out.println("[D] Defining Context " + fate_sequence.get_name()); + init_instructions.add ( - compiler.assembler().merge + compiler.assembler().mark ( - compiler.registers().get_initialize_context_instructions + fate_sequence.get_name(), + compiler.assembler().merge ( - fate_sequence.get_name() + compiler.registers().get_initialize_context_instructions + ( + fate_sequence.get_name() + ) ) ) ); @@ -102,26 +106,41 @@ public class SequenceCompiler init_instructions.add(ic.get_result()); + /* No need: the context is about to be finalized anyway. */ + /* for (final Register r: to_be_cleaned) { compiler.registers().release(r, init_instructions); } + */ + init_instructions.addAll ( compiler.registers().get_finalize_context_instructions() ); + System.out.println + ( + "[D] Completed Context " + + compiler.registers().get_current_context_name() + ); + init_instructions.addAll ( compiler.registers().get_leave_context_instructions() ); + compiler.registers().pop_context(); compiler.assembler().handle_adding_instruction ( - compiler.assembler().merge(init_instructions), + compiler.assembler().mark_after + ( + compiler.assembler().merge(init_instructions), + end_of_sequence + ), compiler.world() ); } 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 449a1ee..83594b5 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 @@ -49,6 +49,12 @@ class StackableRegisterContext extends RegisterContext this.base_context = base_context; context_stack_level = base_context.reserve(Type.INT, initialize_holder); + + initialize_holder.add + ( + new SetValue(context_stack_level.get_address(), Constant.ZERO) + ); + context_stacks = base_context.reserve ( -- cgit v1.2.3-70-g09d2