summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java6
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java84
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()
);
}