| summaryrefslogtreecommitdiff |
diff options
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 ( |


