From 145790f9d7775071866e60b1f7fa4fe5c829bdb0 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 14 Aug 2020 18:43:13 +0200 Subject: Found a way, working on it... --- .../v1/compiler/fate/v1/ComputationCompiler.java | 106 +++++++++++- .../v1/compiler/fate/v1/InstructionCompiler.java | 53 ++++-- .../compiler/util/registers/RegisterManager.java | 182 ++++++++++++++++++++- .../util/registers/StackableRegisterContext.java | 45 ++++- 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 parameters; + final Register result_holder; + final String context_name; + + out_label = compiler.assembler().generate_label(""); + in_label = compiler.assembler().generate_label(""); + + parameters = new ArrayList(); + + 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 parameters; + final Register result; + final String return_to_label; + + target_line_cc = new ComputationCompiler(); + + return_to_label = + compiler.assembler().generate_label(""); + + 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