summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2020-09-08 17:03:16 +0200
committernsensfel <SpamShield0@noot-noot.org>2020-09-08 17:03:16 +0200
commit0abb01e4fcc043dd428e53e8bf21e97831d54ab8 (patch)
tree8a9c3f77e0258493d8ffa67e3e1c9da1299683de
parent59d05224a5831b19668b879a9fe46bfc08dc0784 (diff)
Got it to work, I think...polymorphic_registers
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java4
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java52
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java43
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java6
5 files changed, 83 insertions, 32 deletions
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
index d246012..79004b2 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
@@ -42,10 +42,10 @@ public class Compiler
compiler.compile_types(fate_world);
compiler.compile_variables(fate_world);
- compiler.compile_main_sequence(fate_world);
-
compiler.compile_sequences(fate_world);
+ compiler.compile_main_sequence(fate_world);
+
return compiler.wyrd_world;
}
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 312fa47..d031b66 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
@@ -1619,15 +1619,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
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();
@@ -1638,6 +1629,15 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
init_instructions
);
+ init_instructions.add
+ (
+ compiler.assembler().mark_after
+ (
+ new SetPC(compiler.assembler().get_label_constant(out_label)),
+ in_label
+ )
+ );
+
init_instructions.addAll
(
compiler.registers().get_initialize_context_instructions(context_name)
@@ -1648,7 +1648,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
result_type =
TypeCompiler.compile(compiler, n.get_lambda_function().get_type());
- result_holder = reserve(new PointerType(result_type));
+ result_holder =
+ /* Defining a context, don't use this.reserve(), otherwise this
+ * context-dependent variable will get released outside the context
+ * (where it doesn't exist) and that will cause an error.
+ */
+ compiler.registers().reserve
+ (
+ new PointerType(result_type),
+ init_instructions
+ );
parameters.add(result_holder);
@@ -1656,7 +1665,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
{
final Register r;
- r = reserve(TypeCompiler.compile(compiler, param.get_type()));
+ r =
+ /* Bound registers, can't use this.reserve() */
+ compiler.registers().reserve
+ (
+ TypeCompiler.compile(compiler, param.get_type()),
+ init_instructions
+ );
parameters.add(r);
@@ -1672,7 +1687,12 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
n.get_lambda_function().get_visited_by(expr_compiler);
- assimilate(expr_compiler);
+ /* Nope: its variables are removed when the context is left. */
+ /* assimilate(expr_compiler); */
+ if (expr_compiler.has_init())
+ {
+ init_instructions.add(expr_compiler.get_init());
+ }
init_instructions.add
(
@@ -1682,7 +1702,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
expr_compiler.get_computation()
)
);
-
+/*
+ * No need: it's getting finalized anyway.
+ for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters())
+ {
+ compiler.registers().unbind(param.get_name(), init_instructions);
+ }
+*/
init_instructions.addAll
(
compiler.registers().get_finalize_context_instructions()
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 0dfe2bb..769f2c0 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
@@ -2069,6 +2069,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.addAll(compiler.registers().store_parameters(parameters));
+ for (final ComputationCompiler cc: parameter_ccs)
+ {
+ cc.release_registers(result);
+ }
+
/* Terminate current context */
result.addAll
(
@@ -2085,11 +2090,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
)
);
-
- for (final ComputationCompiler cc: parameter_ccs)
- {
- cc.release_registers(result);
- }
}
@Override
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 5403ca6..6f3a83d 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
@@ -24,17 +24,19 @@ public class SequenceCompiler
)
throws Throwable
{
- final List<Instruction> init_instructions, pre_init;
+ final List<Instruction> init_instructions;
final List<Register> parameters;
+ final String end_of_sequence;
final List<Register> to_be_cleaned;
final InstructionCompiler ic;
init_instructions = new ArrayList<Instruction>();
- pre_init = new ArrayList<Instruction>();
parameters = new ArrayList<Register>();
to_be_cleaned = new ArrayList<Register>();
ic = new InstructionCompiler(compiler);
+ end_of_sequence = compiler.assembler().generate_label("<sequence#end>");
+
compiler.world().add_sequence_label
(
fate_sequence.get_name(),
@@ -46,25 +48,27 @@ public class SequenceCompiler
compiler.registers().create_stackable_context
(
fate_sequence.get_name(),
- pre_init
+ init_instructions
);
init_instructions.add
(
- compiler.assembler().mark
- (
- fate_sequence.get_name(),
- compiler.assembler().merge(pre_init)
- )
+ new SetPC(compiler.assembler().get_label_constant(end_of_sequence))
);
+ System.out.println("[D] Defining Context " + fate_sequence.get_name());
+
init_instructions.add
(
- compiler.assembler().merge
+ compiler.assembler().mark
(
- compiler.registers().get_initialize_context_instructions
+ fate_sequence.get_name(),
+ compiler.assembler().merge
(
- fate_sequence.get_name()
+ compiler.registers().get_initialize_context_instructions
+ (
+ fate_sequence.get_name()
+ )
)
)
);
@@ -102,26 +106,41 @@ public class SequenceCompiler
init_instructions.add(ic.get_result());
+ /* No need: the context is about to be finalized anyway. */
+ /*
for (final Register r: to_be_cleaned)
{
compiler.registers().release(r, init_instructions);
}
+ */
+
init_instructions.addAll
(
compiler.registers().get_finalize_context_instructions()
);
+ System.out.println
+ (
+ "[D] Completed Context "
+ + compiler.registers().get_current_context_name()
+ );
+
init_instructions.addAll
(
compiler.registers().get_leave_context_instructions()
);
+
compiler.registers().pop_context();
compiler.assembler().handle_adding_instruction
(
- compiler.assembler().merge(init_instructions),
+ compiler.assembler().mark_after
+ (
+ compiler.assembler().merge(init_instructions),
+ end_of_sequence
+ ),
compiler.world()
);
}
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 449a1ee..83594b5 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
@@ -49,6 +49,12 @@ class StackableRegisterContext extends RegisterContext
this.base_context = base_context;
context_stack_level = base_context.reserve(Type.INT, initialize_holder);
+
+ initialize_holder.add
+ (
+ new SetValue(context_stack_level.get_address(), Constant.ZERO)
+ );
+
context_stacks =
base_context.reserve
(