| summaryrefslogtreecommitdiff |
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 14:33:01 +0200 |
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 14:33:01 +0200 |
| commit | 59d05224a5831b19668b879a9fe46bfc08dc0784 (patch) | |
| tree | 0c5eb57a3c4e524a7af7e384351314280c2ee1d0 | |
| parent | 7d8ad25fb295d64c33f39273bc61b004a1bdb2af (diff) | |
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.
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<Instruction> 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<Instruction>(); - 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("<AfterForEach>"); @@ -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<Instruction> init_instructions; + final List<Instruction> init_instructions, pre_init; final List<Register> parameters; final List<Register> to_be_cleaned; - final String end_of_sequence; final InstructionCompiler ic; init_instructions = new ArrayList<Instruction>(); + pre_init = new ArrayList<Instruction>(); parameters = new ArrayList<Register>(); to_be_cleaned = new ArrayList<Register>(); ic = new InstructionCompiler(compiler); - end_of_sequence = compiler.assembler().generate_label("<sequence#end>"); - 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<Instruction> 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<String, Type>()); + } + protected Map<String, Type> fields; public DictType (final String name, final Map<String, Type> 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"); } /***************************************************************************/ |


