| 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 /src | |
| 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.
Diffstat (limited to 'src')
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");     }     /***************************************************************************/ | 


