| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 17:03:16 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2020-09-08 17:03:16 +0200 | 
| commit | 0abb01e4fcc043dd428e53e8bf21e97831d54ab8 (patch) | |
| tree | 8a9c3f77e0258493d8ffa67e3e1c9da1299683de /src | |
| parent | 59d05224a5831b19668b879a9fe46bfc08dc0784 (diff) | |
Got it to work, I think...polymorphic_registers
Diffstat (limited to 'src')
5 files changed, 83 insertions, 32 deletions
| diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java index d246012..79004b2 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java @@ -42,10 +42,10 @@ public class Compiler        compiler.compile_types(fate_world);        compiler.compile_variables(fate_world); -      compiler.compile_main_sequence(fate_world); -        compiler.compile_sequences(fate_world); +      compiler.compile_main_sequence(fate_world); +        return compiler.wyrd_world;     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 312fa47..d031b66 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -1619,15 +1619,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        out_label = compiler.assembler().generate_label("<lambda_expr#out>");        in_label = compiler.assembler().generate_label("<lambda_expr#in>"); -      init_instructions.add -      ( -         compiler.assembler().mark_after -         ( -            new SetPC(compiler.assembler().get_label_constant(out_label)), -            in_label -         ) -      ); -        parameters = new ArrayList<Register>();        context_name = compiler.registers().create_stackable_context_name(); @@ -1638,6 +1629,15 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor           init_instructions        ); +      init_instructions.add +      ( +         compiler.assembler().mark_after +         ( +            new SetPC(compiler.assembler().get_label_constant(out_label)), +            in_label +         ) +      ); +        init_instructions.addAll        (           compiler.registers().get_initialize_context_instructions(context_name) @@ -1648,7 +1648,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_type =           TypeCompiler.compile(compiler, n.get_lambda_function().get_type()); -      result_holder = reserve(new PointerType(result_type)); +      result_holder = +         /* Defining a context, don't use this.reserve(), otherwise this +          * context-dependent variable will get released outside the context +          * (where it doesn't exist) and that will cause an error. +          */ +         compiler.registers().reserve +         ( +            new PointerType(result_type), +            init_instructions +         );        parameters.add(result_holder); @@ -1656,7 +1665,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        {           final Register r; -         r = reserve(TypeCompiler.compile(compiler, param.get_type())); +         r = +            /* Bound registers, can't use this.reserve() */ +            compiler.registers().reserve +            ( +               TypeCompiler.compile(compiler, param.get_type()), +               init_instructions +            );           parameters.add(r); @@ -1672,7 +1687,12 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        n.get_lambda_function().get_visited_by(expr_compiler); -      assimilate(expr_compiler); +      /* Nope: its variables are removed when the context is left. */ +      /* assimilate(expr_compiler); */ +      if (expr_compiler.has_init()) +      { +         init_instructions.add(expr_compiler.get_init()); +      }        init_instructions.add        ( @@ -1682,7 +1702,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              expr_compiler.get_computation()           )        ); - +/* + * No need: it's getting finalized anyway. +      for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters()) +      { +         compiler.registers().unbind(param.get_name(), init_instructions); +      } +*/        init_instructions.addAll        (           compiler.registers().get_finalize_context_instructions() diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 0dfe2bb..769f2c0 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -2069,6 +2069,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        result.addAll(compiler.registers().store_parameters(parameters)); +      for (final ComputationCompiler cc: parameter_ccs) +      { +         cc.release_registers(result); +      } +        /* Terminate current context */        result.addAll        ( @@ -2085,11 +2090,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              )           )        ); - -      for (final ComputationCompiler cc: parameter_ccs) -      { -         cc.release_registers(result); -      }     }     @Override diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 5403ca6..6f3a83d 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -24,17 +24,19 @@ public class SequenceCompiler     )     throws Throwable     { -      final List<Instruction> init_instructions, pre_init; +      final List<Instruction> init_instructions;        final List<Register> parameters; +      final String end_of_sequence;        final List<Register> to_be_cleaned;        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(), @@ -46,25 +48,27 @@ public class SequenceCompiler        compiler.registers().create_stackable_context        (           fate_sequence.get_name(), -         pre_init +         init_instructions        );        init_instructions.add        ( -         compiler.assembler().mark -         ( -            fate_sequence.get_name(), -            compiler.assembler().merge(pre_init) -         ) +         new SetPC(compiler.assembler().get_label_constant(end_of_sequence))        ); +      System.out.println("[D] Defining Context " + fate_sequence.get_name()); +        init_instructions.add        ( -         compiler.assembler().merge +         compiler.assembler().mark           ( -            compiler.registers().get_initialize_context_instructions +            fate_sequence.get_name(), +            compiler.assembler().merge              ( -               fate_sequence.get_name() +               compiler.registers().get_initialize_context_instructions +               ( +                  fate_sequence.get_name() +               )              )           )        ); @@ -102,26 +106,41 @@ public class SequenceCompiler        init_instructions.add(ic.get_result()); +      /* No need: the context is about to be finalized anyway. */ +      /*        for (final Register r: to_be_cleaned)        {           compiler.registers().release(r, init_instructions);        } +      */ +        init_instructions.addAll        (           compiler.registers().get_finalize_context_instructions()        ); +      System.out.println +      ( +         "[D] Completed Context " +         + compiler.registers().get_current_context_name() +      ); +        init_instructions.addAll        (           compiler.registers().get_leave_context_instructions()        ); +        compiler.registers().pop_context();        compiler.assembler().handle_adding_instruction        ( -         compiler.assembler().merge(init_instructions), +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge(init_instructions), +            end_of_sequence +         ),           compiler.world()        );     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java index 449a1ee..83594b5 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java @@ -49,6 +49,12 @@ class StackableRegisterContext extends RegisterContext        this.base_context = base_context;        context_stack_level = base_context.reserve(Type.INT, initialize_holder); + +      initialize_holder.add +      ( +         new SetValue(context_stack_level.get_address(), Constant.ZERO) +      ); +        context_stacks =           base_context.reserve           ( | 


