| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 17:04:50 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 17:04:50 +0200 | 
| commit | c6642fdc7b7aae352d5fa5478bad2f4369b4f8b9 (patch) | |
| tree | 5fd4abd9cca2b41a681540d3639a62e1487f0e80 /src/core | |
| parent | b9736f781266169a02c4833d4d87459781352e9c (diff) | |
| parent | 0abb01e4fcc043dd428e53e8bf21e97831d54ab8 (diff) | |
Merge branch 'master' into extra_functional
Diffstat (limited to 'src/core')
16 files changed, 370 insertions, 322 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..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 @@ -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        ); @@ -46,8 +46,6 @@ public class Compiler        compiler.compile_main_sequence(fate_world); -      compiler.add_registers(); -        return compiler.wyrd_world;     } @@ -106,9 +104,8 @@ public class Compiler           final Register r;           t = TypeCompiler.compile(this, variable.get_type()); -         r = registers.register(t, variable.get_name()); - -         r.set_is_in_use(true); +         r = registers.register(t, variable.get_name(), init_instr); +         wyrd_world.add_register(r);        }        this.assembler().handle_adding_instruction @@ -146,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..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 @@ -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); @@ -1619,6 +1619,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        out_label = compiler.assembler().generate_label("<lambda_expr#out>");        in_label = compiler.assembler().generate_label("<lambda_expr#in>"); +      parameters = new ArrayList<Register>(); + +      context_name = compiler.registers().create_stackable_context_name(); + +      compiler.registers().create_stackable_context +      ( +         context_name, +         init_instructions +      ); +        init_instructions.add        (           compiler.assembler().mark_after @@ -1628,12 +1638,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor           )        ); -      parameters = new ArrayList<Register>(); - -      context_name = compiler.registers().create_stackable_context_name(); - -      compiler.registers().create_stackable_context(context_name); -        init_instructions.addAll        (           compiler.registers().get_initialize_context_instructions(context_name) @@ -1644,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); @@ -1652,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); @@ -1668,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        ( @@ -1678,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() @@ -1796,7 +1826,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 +1853,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..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 @@ -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);        }     } @@ -2054,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        ( @@ -2070,11 +2090,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              )           )        ); - -      for (final ComputationCompiler cc: parameter_ccs) -      { -         cc.release_registers(); -      }     }     @Override @@ -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 16f7ec0..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 @@ -26,8 +26,8 @@ public class SequenceCompiler     {        final List<Instruction> init_instructions;        final List<Register> parameters; -      final List<Register> to_be_cleaned;        final String end_of_sequence; +      final List<Register> to_be_cleaned;        final InstructionCompiler ic;        init_instructions = new ArrayList<Instruction>(); @@ -47,7 +47,8 @@ public class SequenceCompiler        compiler.registers().create_stackable_context        ( -         fate_sequence.get_name() +         fate_sequence.get_name(), +         init_instructions        );        init_instructions.add @@ -55,6 +56,8 @@ public class SequenceCompiler           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().mark @@ -83,7 +86,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,35 +101,41 @@ public class SequenceCompiler           compiler.registers().read_parameters(parameters)        ); +        fate_sequence.get_root().get_visited_by(ic);        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()        ); -      for (final Register r: to_be_cleaned) -      { -         compiler.registers().release(r); -      }        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           (              compiler.assembler().merge(init_instructions), @@ -164,13 +174,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 c0d70a3..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 @@ -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  { @@ -23,7 +24,7 @@ class RegisterContext     protected final Map<String, Register> register_by_name;     protected final Map<String, Register> aliased_registers;     protected final Deque<Collection<String>> hierarchical_aliases; -   protected final Map<Type, List<Register>> anonymous_register_by_type; +   protected final List<Register> anonymous_registers;     protected final String name_prefix;     protected int generated_registers; @@ -34,7 +35,7 @@ class RegisterContext        register_by_name = new HashMap<String, Register>();        aliased_registers = new HashMap<String, Register>();        hierarchical_aliases = new ArrayDeque<Collection<String>>(); -      anonymous_register_by_type = new HashMap<Type, List<Register>>(); +      anonymous_registers = new ArrayList<Register>();        name_prefix = default_name_prefix;        generated_registers = 0; @@ -46,7 +47,7 @@ class RegisterContext        register_by_name = new HashMap<String, Register>();        aliased_registers = new HashMap<String, Register>(); -      anonymous_register_by_type = new HashMap<Type, List<Register>>(); +      anonymous_registers = new ArrayList<Register>();        hierarchical_aliases = new ArrayDeque<Collection<String>>();        this.name_prefix = name_prefix; @@ -71,22 +72,14 @@ class RegisterContext     {        final String name;        final Register result; -      List<Register> list; -      list = anonymous_register_by_type.get(t); - -      if (list == null) -      { -         list = new ArrayList<Register>(); - -         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); + +            initialize_holder.add(new Initialize(r.get_address(), t));              return r;           } @@ -94,11 +87,11 @@ class RegisterContext        name = (name_prefix + Integer.toString(generated_registers++)); -      result = create_register(t, name, initialize_holder); +      result = create_register(t, name); -      result.set_is_in_use(true); +      initialize_holder.add(new Initialize(result.get_address(), t)); -      list.add(result); +      anonymous_registers.add(result);        register_by_name.put(name, result); @@ -114,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)        { @@ -126,9 +119,9 @@ class RegisterContext           );        } -      register_by_name.put(name, result); +      initialize_holder.add(new Initialize(result.get_address(), t)); -      result.set_is_in_use(true); +      register_by_name.put(name, result);        return result;     } @@ -155,10 +148,12 @@ class RegisterContext        }     } -   public void unbind (final String name) +   public void unbind (final String name, final List<Instruction> instr_holder)     { -      release(aliased_registers.get(name)); +      release(aliased_registers.get(name), instr_holder); +        aliased_registers.remove(name); +        if (!hierarchical_aliases.isEmpty())        {           hierarchical_aliases.peekFirst().remove(name); @@ -170,11 +165,14 @@ class RegisterContext        hierarchical_aliases.push(new ArrayList<String>());     } -   public void pop_hierarchical_instruction_level () +   public void pop_hierarchical_instruction_level +   ( +      final List<Instruction> instr_holder +   )     {        for (final String s: hierarchical_aliases.pop())        { -         unbind(s); +         unbind(s, instr_holder);        }     } @@ -194,26 +192,43 @@ 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) +   public void release (final Register r, final List<Instruction> instr_holder)     { -      r.set_is_in_use(false); +      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();     } -   protected Register create_register -   ( -      final Type t, -      final String name, -      final List<Instruction> initialize_holder -   ) +   protected Register create_register (final Type t, final String name)     {        final Register result; -      result = new Register(t, name); - -      initialize_holder.add(new Initialize(result.get_address(), t)); +      result = new Register(name); +      result.activate(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 07ea1ac..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 @@ -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<Instruction> awaiting_inits; +   protected final List<Instruction> 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<Instruction> 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<Instruction> 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<Instruction> 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<Instruction> 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<Instruction> instr_holder)     { -      context.peekFirst().unbind(name); +      context.peekFirst().unbind(name, instr_holder);     }     public Register get_context_register (final String name) @@ -163,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;     } @@ -289,23 +302,12 @@ public class RegisterManager        context.peekFirst().push_hierarchical_instruction_level();     } -   public void pop_hierarchical_instruction_level () +   public void pop_hierarchical_instruction_level +   ( +      final List<Instruction> instr_holder +   )     { -      context.peekFirst().pop_hierarchical_instruction_level(); -   } - -   public Collection<DictType> get_context_structure_types () -   { -      final Collection<DictType> result; - -      result = new ArrayList<DictType>(); - -      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<Register> get_base_registers () @@ -325,7 +327,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)); @@ -335,7 +337,9 @@ 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(); +         // Do not use the context to deactivate here, otherwise the value will +         // be removed.        }        return result; @@ -345,15 +349,17 @@ public class RegisterManager     {        final List<Register> used_registers;        final List<Instruction> result; +      final List<Instruction> ignored_inits;        used_registers = new ArrayList<Register>();        result = new ArrayList<Instruction>(); +      ignored_inits = new ArrayList<Instruction>();        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 +369,14 @@ 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); +         parameter_context.release(r, result);        }        return result;     } -   public List<Instruction> pop_initializes () +   public List<Instruction> get_initialization ()     { -      final List<Instruction> result; - -      result = awaiting_inits; - -      awaiting_inits = new ArrayList<Instruction>(); - -      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 8731d8c..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 @@ -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; @@ -26,16 +24,14 @@ 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; -import tonkadur.wyrd.v1.lang.type.DictType;  class StackableRegisterContext extends RegisterContext  { -   protected final Map<String, Type> 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 +48,17 @@ class StackableRegisterContext extends RegisterContext        this.base_context = base_context; -      context_structure_fields = new HashMap<String, Type>(); +      context_stack_level = base_context.reserve(Type.INT, initialize_holder); -      context_structure = new DictType(context_name, context_structure_fields); +      initialize_holder.add +      ( +         new SetValue(context_stack_level.get_address(), Constant.ZERO) +      ); -      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(DictType.WILD)),              initialize_holder           ); @@ -69,55 +67,27 @@ class StackableRegisterContext extends RegisterContext           (              context_stacks.get_address(),              new Cast(context_stack_level.get_value(), Type.STRING), -            new PointerType(context_structure) +            new PointerType(DictType.WILD)           );        current_context_address =              new Address              (                 new ValueOf(current_context_address_holder), -               context_structure +               DictType.WILD              );     }     @Override -   protected Register create_register -   ( -      final Type t, -      final String name, -      final List<Instruction> 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 -            + "." -         ); -      } +      result = new Register(current_context_address, name); -      context_structure.get_fields().put(name, t); +      result.activate(t); -      result = -         new Register -         ( -            new RelativeAddress -            ( -               current_context_address, -               new Constant(Type.STRING, name), -               t -            ), -            t, -            name -         ); - -      /* No need for this: it's part of the type. */ +      /* Handled elsewhere */        //initialize_holder.add(new Initialize(result.get_address(), t));        return result; @@ -143,7 +113,7 @@ class StackableRegisterContext extends RegisterContext           new Initialize           (              current_context_address_holder, -            new PointerType(context_structure) +            new PointerType(DictType.WILD)           )        ); @@ -152,7 +122,7 @@ class StackableRegisterContext extends RegisterContext           new SetValue           (              current_context_address_holder, -            new New(context_structure) +            new New(DictType.WILD)           )        ); @@ -180,9 +150,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/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;     }  } 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) | 


