| 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 | |
| parent | 145790f9d7775071866e60b1f7fa4fe5c829bdb0 (diff) | |
...
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 () |


