| summaryrefslogtreecommitdiff |
diff options
| -rw-r--r-- | src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java | 6 | ||||
| -rw-r--r-- | src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 84 |
2 files changed, 80 insertions, 10 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 456e681..575af47 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 @@ -1384,8 +1384,10 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor compiler.registers().bind(param.get_name(), r); } - compiler.registers().read_parameters(parameters); - + init_instructions.addAll + ( + compiler.registers().read_parameters(parameters) + ); expr_compiler = new ComputationCompiler(compiler); 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 b397dd2..02283fa 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 @@ -1,10 +1,12 @@ package tonkadur.wyrd.v1.compiler.fate.v1; import java.util.List; +import java.util.ArrayList; import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.World; +import tonkadur.wyrd.v1.lang.Register; public class SequenceCompiler { @@ -18,10 +20,23 @@ public class SequenceCompiler ) throws Throwable { + final List<Instruction> init_instructions; + final List<Register> parameters; + final List<Register> to_be_cleaned; final InstructionCompiler ic; + init_instructions = new ArrayList<Instruction>(); + parameters = new ArrayList<Register>(); + to_be_cleaned = new ArrayList<Register>(); ic = new InstructionCompiler(compiler); + + compiler.world().add_sequence_label + ( + fate_sequence.get_name(), + (compiler.world().get_current_line() + 1) + ); + compiler.assembler().add_fixed_name_label(fate_sequence.get_name()); System.out.println @@ -31,21 +46,74 @@ public class SequenceCompiler + "'..." ); + compiler.registers().create_stackable_context(fate_sequence.get_name()); + + init_instructions.add + ( + compiler.assembler().mark + ( + fate_sequence.get_name(), + compiler.assembler().merge + ( + compiler.registers().get_initialize_context_instructions + ( + fate_sequence.get_name() + ) + ) + ) + ); + + compiler.registers().push_context(fate_sequence.get_name()); + + for + ( + final tonkadur.fate.v1.lang.Variable param: + fate_sequence.get_signature() + ) + { + final Register r; + + r = + compiler.registers().reserve + ( + TypeCompiler.compile(compiler, param.get_type()) + ); + + parameters.add(r); + to_be_cleaned.add(r); + + compiler.registers().bind(param.get_name(), r); + } + + init_instructions.addAll + ( + compiler.registers().read_parameters(parameters) + ); + fate_sequence.get_root().get_visited_by(ic); - compiler.world().add_sequence_label + init_instructions.add(ic.get_result()); + + init_instructions.addAll ( - fate_sequence.get_name(), - (compiler.world().get_current_line() + 1) + compiler.registers().get_finalize_context_instructions() ); + init_instructions.addAll + ( + compiler.registers().get_leave_context_instructions() + ); + + for (final Register r: to_be_cleaned) + { + compiler.registers().release(r); + } + + compiler.registers().pop_context(); + compiler.assembler().handle_adding_instruction ( - compiler.assembler().mark - ( - fate_sequence.get_name(), - ic.get_result() - ), + compiler.assembler().merge(init_instructions), compiler.world() ); } |


