| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core')
| -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()        );     } | 


