| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 22:40:27 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 22:40:27 +0200 | 
| commit | e498c87926a76f21937af2e5b1b08e88f78178c1 (patch) | |
| tree | 9500b279a171097ca3cf1c6ea961cb93dfae472c /src/core | |
| parent | 145790f9d7775071866e60b1f7fa4fe5c829bdb0 (diff) | |
...
Diffstat (limited to 'src/core')
4 files changed, 171 insertions, 48 deletions
| 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 bbdb47c..6115e6e 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 @@ -1336,21 +1336,36 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        final String out_label, in_label;        final List<Register> parameters;        final Register result_holder; +      final ComputationCompiler expr_cc;        final String context_name;        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();        compiler.registers().create_stackable_context(context_name); +      init_instructions.addAll +      ( +         compiler.registers().get_initialize_context_instructions(context_name) +      ); +        compiler.registers().push_context(context_name);        result_holder = -         compiler.registers().reserve +         reserve           (              new PointerType              ( @@ -1364,18 +1379,55 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        parameters.add(result_holder); -      for (final +      for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters()) +      { +         final Register r; + +         r = reserve(TypeCompiler.compile(compiler, param.get_type())); + +         parameters.add(r); + +         compiler.registers().bind(r, param.get_name()); +      } +        compiler.registers().read_parameters(parameters); -      /* create new context */ -      /* push context */ -      /* (mark_after (setpc (label out)) (label in)) */ -      /* cc = compile lambda_expression */ -      /* (set result = cc.get_result()) -      /* (mark_after (merge (exit_instr)) (label out)) */ -      /* pop context */ -      /* result = (label in) */ +      expr_compiler = new ComputationCompiler(compiler); + +      n.get_lambda_function().get_visited_by(expr_compiler); + +      assimilate(expr_compiler); + +      init_instructions.add +      ( +         new SetValue +         ( +            result_holder.get_value(), +            expr_compiler.get_computation() +         ) +      ); + +      init_instructions.addAll +      ( +         compiler.registers().get_finalize_context_instructions(context_name) +      ); + +      init_instructions.add +      ( +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge +            ( +               compiler.registers().get_exit_context_instructions() +            ), +            out_label +         ) +      ); + +      compiler.registers().pop_context(context_name); + +      result_as_computation = compiler.assembler().get_label_constant(in_label);     }     @Override @@ -1399,11 +1451,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        assimilate(target_line_cc); -      result = -         compiler.registers().reserve -         ( -            TypeCompiler.compile(compiler, n.get_type()) -         ); +      result = reserve(TypeCompiler.compile(compiler, n.get_type()));        parameters.add(result.get_address()); 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 2459f2a..e5d4342 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 @@ -1662,11 +1662,58 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* TODO */ -      /* ... handle parameters ... */ +      final List<ComputationCompiler> parameters; +      final String return_to_label; -      /* init target seq */ -      /* enter target seq */ +      return_to_label = +         compiler.assembler().generate_label("<seq_call#return_to>"); + +      parameters = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         param.get_visited_by(cc); + +         if (cc.has_init()) +         { +            result.add(cc.get_init()); +         } + +         parameters.add(cc.get_computation()); +      } + +      result.addAll(compiler.registers().store_parameters(parameters)); + +      result.add +      ( +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge +            ( +               compiler.registers().get_visit_context_instructions +               ( +                  compiler.assembler().get_label_constant +                  ( +                     n.get_sequence_name() +                  ), +                  return_to_label +               ) +            ), +            return_to_label +         ) +      ); + +      for (final ComputationCompiler cc: parameters) +      { +         cc.release_registers(); +      }     }     @Override @@ -1676,22 +1723,42 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* TODO */ -      final String sequence_name; - -      sequence_name = n.get_sequence_name(); +      final List<ComputationCompiler> parameters; -      /* ... handle parameters ... */ +      parameters = new ArrayList<Computation>(); -      if (compiler.registers().get_current_context_name().equals(sequence_name)) +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() +      )        { -         /* Special case, we morph into it. */ +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         param.get_visited_by(cc); + +         if (cc.has_init()) +         { +            result.add(cc.get_init()); +         } + +         parameters.add(cc.get_computation());        } -      else + +      result.addAll(compiler.registers().store_parameters(parameters)); + +      result.addAll +      ( +         compiler.registers().get_jump_to_context_instructions +         ( +            compiler.assembler().get_label_constant(n.get_sequence_name()) +         ) +      ); + +      for (final ComputationCompiler cc: parameters)        { -         /* init target seq */ -         /* finalize current seq */ -         /* jump to current seq */ +         cc.release_registers();        }     } 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 6dd9401..50e63d1 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,23 +172,11 @@ public class RegisterManager     public List<Instruction> get_initialize_context_instructions     ( -      final String context_name, -      final List<Computation> parameters +      final String context_name     )     {        return -         context_by_name.get(context_name).get_initialize_instructions -         ( -            parameters -         ); -   } - -   public List<Instruction> get_morph_into_context_instructions -   ( -      final List<Computation> parameters -   ) -   { -      return context.peekFirst().get_morph_into_instructions(parameters); +         context_by_name.get(context_name).get_initialize_instructions();     }     public String get_current_context_name () 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 d099e8e..6a7ce1d 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 @@ -73,8 +73,7 @@ class StackableRegisterContext extends RegisterContext        if (context_structure.get_fields().get(name) != null)        { -   ; -   System.err.println +         System.err.println           (              "[P] Duplicate register '"              + name @@ -102,8 +101,29 @@ class StackableRegisterContext extends RegisterContext     public List<Instruction> get_initialize_instructions ()     { -      /* TODO */ -      return new ArrayList<>(); +      final List<Instruction> result; + +      result = new ArrayList<Instruction>(); + +      result.add +      ( +         new SetValue +         ( +            context_stack_level.get_address(), +            Operation.plus(context_stack_level.get_value, Constant.ONE) +         ) +      ); + +      result.add +      ( +         new SetValue +         ( +            current_context_address_holder, +            new New(context_structure) +         ) +      ); + +      return result;     }     public List<Instruction> get_finalize_instructions () | 


