| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 18:43:13 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 18:43:13 +0200 | 
| commit | 145790f9d7775071866e60b1f7fa4fe5c829bdb0 (patch) | |
| tree | 38bd224dd3e5ed5b0028e5e0d929c55108be0362 /src/core | |
| parent | 0620617b2cee1f76efc57c9ef464fb8a1bc60e41 (diff) | |
Found a way, working on it...
Diffstat (limited to 'src/core')
4 files changed, 356 insertions, 30 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 7d92f21..bbdb47c 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 @@ -1333,7 +1333,49 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO */ +      final String out_label, in_label; +      final List<Register> parameters; +      final Register result_holder; +      final String context_name; + +      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); + +      compiler.registers().push_context(context_name); + +      result_holder = +         compiler.registers().reserve +         ( +            new PointerType +            ( +               TypeCompiler.compile +               ( +                  compiler, +                  n.get_lambda_function().get_type() +               ) +            ) +         ); + +      parameters.add(result_holder); + +      for (final +      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) */     }     @Override @@ -1343,7 +1385,67 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO */ +      final ComputationCompiler target_line_cc; +      final List<Computation> parameters; +      final Register result; +      final String return_to_label; + +      target_line_cc = new ComputationCompiler(); + +      return_to_label = +         compiler.assembler().generate_label("<lambda_eval#return_to>"); + +      n.get_lambda_function_reference().get_visited_by(target_line_cc); + +      assimilate(target_line_cc); + +      result = +         compiler.registers().reserve +         ( +            TypeCompiler.compile(compiler, n.get_type()) +         ); + +      parameters.add(result.get_address()); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         param.get_visited_by(cc); + +         assimilate(cc); + +         parameters.add(cc.get_computation()); +      } + +      init_instructions.addAll +      ( +         compiler.registers().store_parameters(parameters); +      ); + +      init_instructions.add +      ( +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge +            ( +               compiler.registers().get_visit_context_instructions +               ( +                  target_line_cc.get_computation(), +                  return_to_label +               ) +            ), +            return_to_label +         ) +      ); + +      result_as_address = result.get_address(); +      result_as_computation = result.get_value();     }     @Override 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 6b9e6b9..2459f2a 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 @@ -233,7 +233,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* TODO */ +      final Register r; + +      r = compiler.registers().reserve(n.get_type()); + +      compiler.registers().bind(r, n.get_name());     }     @Override @@ -1205,7 +1209,20 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* TODO */ +      result.add +      ( +         compiler.assembler().merge +         ( +            compiler.registers().get_finalize_context_instructions() +         ) +      ); +      result.add +      ( +         compiler.assembler().merge +         ( +            compiler.registers().get_leave_context_instructions() +         ) +      );     }     @Override @@ -1646,6 +1663,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     throws Throwable     {        /* TODO */ +      /* ... handle parameters ... */ + +      /* init target seq */ +      /* enter target seq */     }     @Override @@ -1655,19 +1676,23 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* -       * Fate: (sequence_call string) -       * Wyrd: (set_pc <label string>) -       */ -      compiler.assembler().add_fixed_name_label(n.get_sequence_name()); +      /* TODO */ +      final String sequence_name; -      result.add -      ( -         new SetPC -         ( -            compiler.assembler().get_label_constant(n.get_sequence_name()) -         ) -      ); +      sequence_name = n.get_sequence_name(); + +      /* ... handle parameters ... */ + +      if (compiler.registers().get_current_context_name().equals(sequence_name)) +      { +         /* Special case, we morph into it. */ +      } +      else +      { +         /* init target seq */ +         /* finalize current seq */ +         /* jump to current seq */ +      }     }     @Override 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 88f3eeb..6dd9401 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 @@ -27,12 +27,16 @@ public class RegisterManager     protected static final String context_name_prefix = ".context.";     protected final Map<String, StackableRegisterContext> context_by_name;     protected final Deque<RegisterContext> context; -   protected final RegisterContext base_context; +   protected final RegisterContext base_context, parameter_context; +   protected final Register next_pc, pc_stack;     protected int created_contexts;     public RegisterManager ()     {        base_context = new RegisterContext("base context"); +      parameter_context = new RegisterContext("parameter context", ".param."); +      next_pc = base_context.reserve(Type.INT); +      pc_stack = base_context.reserve(new MapType(Type.INT));        context_by_name = new HashMap<String, StackableRegisterContext>();        context = new ArrayDeque<RegisterContext>(); @@ -70,6 +74,30 @@ public class RegisterManager        context_by_name.put(context_name, result);     } +   public void push_context (final String context_name) +   { +      final StackableRegisterContext target; + +      target = context_by_name.get(context_name); + +      if (target == null) +      { +         System.err.println +         ( +            "[P] Cannot push unknown context '" +            + context +            + "'." +         ); +      } + +      context.push(target); +   } + +   public void pop_context () +   { +      context.pop(); +   } +     public Register register (final Type t, final String name)     {        return context.peekFirst().reserve(t, name); @@ -99,20 +127,104 @@ public class RegisterManager        return result;     } -   public List<Instruction> get_enter_context_instructions +   public List<Instruction> get_visit_context_instructions +   ( +      final Computation enter_at, +      final Computation leave_to +   ) +   { +      final List<Instruction> result; + +      result = new ArrayList<Instruction>(); + +      result.add +      ( +         new SetValue +         ( +            new RelativeAddress +            ( +               pc_stack.get_address(), +               new Size(pc_stack.get_address()), +               Type.INT +            ), +            leave_to +         ) +      ); + +      result.add(new SetPC(enter_at)); + +      return result; +   } + +   public List<Instruction> get_jump_to_context_instructions     ( -      final String context_name +      final Computation enter_at     )     { -      return context_by_name.get(context_name).get_enter_instructions(); +      final List<Instruction> result; + +      result = new ArrayList<Instruction>(); + +      result.add(new SetPC(enter_at)); + +      return result; +   } + +   public List<Instruction> get_initialize_context_instructions +   ( +      final String context_name, +      final List<Computation> parameters +   ) +   { +      return +         context_by_name.get(context_name).get_initialize_instructions +         ( +            parameters +         );     } -   public List<Instruction> get_leave_context_instructions +   public List<Instruction> get_morph_into_context_instructions     ( -      final String context_name +      final List<Computation> parameters     )     { -      return context_by_name.get(context_name).get_leave_instructions(); +      return context.peekFirst().get_morph_into_instructions(parameters); +   } + +   public String get_current_context_name () +   { +      return context.peekFirst().get_name(); +   } + +   public List<Instruction> get_leave_context_instructions () +   { +      final Address return_to_address; +      final List<Instruction> result; + +      return_to_address = +         new RelativeAddress +         ( +            pc_stack.get_address(), +            new Size(pc_stack.get_address()), +            Type.INT +         ); + +      result = new ArrayList<Instruction>(); + +      result.add +      ( +         new SetValue(next_pc.get_address(), new ValueOf(return_to_address)) +      ); + +      result.add(new Remove(return_to_address)); +      result.add(new SetPC(next.pc.get_value())); + +      return result; +   } + +   public List<Instruction> get_finalize_context_instructions () +   { +      return context.peekFirst().get_finalize_instructions();     }     public Collection<DictType> get_context_structure_types () @@ -133,4 +245,60 @@ public class RegisterManager     {        return base_context.get_all_registers();     } + +   public List<Instruction> store_parameters (final List<Computation> params) +   { +      final List<Register> used_registers; +      final List<Instruction> result; + +      used_registers = new ArrayList<Register>(); +      result = new ArrayList<Instruction>(); + +      for (final Computation p: params) +      { +         final Register r; + +         r = parameters_context.reserve(p.get_type()); + +         result.add(new SetValue(r.get_address(), p)); + +         used_registers.add(r); +      } + +      for (final Register r: used_registers) +      { +         /* Side-channel attack to pass parameters, because it's convenient. */ +         r.set_is_in_use(false); +      } + +      return result; +   } + +   public List<Instruction> read_parameters (final List<Register> params) +   { +      final List<Register> used_registers; +      final List<Instruction> result; + +      used_registers = new ArrayList<Register>(); +      result = new ArrayList<Instruction>(); + +      for (final Register p: params) +      { +         final Register r; + +         r = parameters_context.reserve(p.get_type()); + +         result.add(new SetValue(p.get_address(), r.get_value())); + +         used_registers.add(r); +      } + +      for (final Register r: used_registers) +      { +         /* Side-channel attack to pass parameters, because it's convenient. */ +         r.set_is_in_use(false); +      } + +      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 e8f79a8..d099e8e 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 @@ -27,10 +27,12 @@ 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; +   protected final Address current_context_address_holder; +   protected final Computation current_context_address;     public StackableRegisterContext     ( @@ -40,6 +42,8 @@ class StackableRegisterContext extends RegisterContext     {        super(context_name); +      this.base_context = base_context; +        context_structure_fields = new HashMap<String, Type>();        context_structure = new DictType(context_name, context_structure_fields); @@ -51,13 +55,15 @@ class StackableRegisterContext extends RegisterContext              new MapType(new PointerType(context_structure))           ); -      current_context_address = +      current_context_address_holder =           new RelativeAddress           (              context_stacks.get_address(),              new Cast(context_stack_level.get_value(), Type.STRING),              new PointerType(context_structure)           ); + +      current_context_address = new ValueOf(current_context_address_holder);     }     @Override @@ -67,7 +73,8 @@ class StackableRegisterContext extends RegisterContext        if (context_structure.get_fields().get(name) != null)        { -         System.err.println +   ; +   System.err.println           (              "[P] Duplicate register '"              + name @@ -93,16 +100,40 @@ class StackableRegisterContext extends RegisterContext           );     } -   public List<Instruction> get_enter_instructions () +   public List<Instruction> get_initialize_instructions ()     {        /* TODO */        return new ArrayList<>();     } -   public List<Instruction> get_leave_instructions () +   public List<Instruction> get_finalize_instructions ()     { -      /* TODO */ -      return new ArrayList<>(); +      final List<Instruction> result; + +      result = new ArrayList<Instruction>(); + +      result.add(new Remove(current_context_address)); +      result.add(new Remove(current_context_address_holder)); + +      result.add +      ( +         new SetValue +         ( +            context_stack_level.get_address(), +            Operation.minus(context_stack_level.get_value(), Constant.ONE) +         ) +      ); + +      result.add +      ( +         new SetValue +         ( +            context_stack_level.get_address(), +            Operation.minus(context_stack_level.get_value(), Constant.ONE) +         ) +      ); + +      return result;     }     public DictType get_structure_type () | 


