| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 23:12:21 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 23:12:21 +0200 |
| commit | 2c2199dcd2e6784fca93b42bcc2f6d7c9d8e2291 (patch) | |
| tree | 50ed5c64e1d97c2d99940e6c0991bf05d24bae18 | |
| parent | e498c87926a76f21937af2e5b1b08e88f78178c1 (diff) | |
Hey, it compiles...
5 files changed, 90 insertions, 39 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 6115e6e..456e681 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 @@ -17,6 +17,7 @@ import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.lang.type.PointerType; import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.SetPC; import tonkadur.wyrd.v1.compiler.util.BinarySearch; import tonkadur.wyrd.v1.compiler.util.IfElse; @@ -1336,7 +1337,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor final String out_label, in_label; final List<Register> parameters; final Register result_holder; - final ComputationCompiler expr_cc; + final ComputationCompiler expr_compiler; + final Type result_type; final String context_name; out_label = compiler.assembler().generate_label("<lambda_expr#out>"); @@ -1346,9 +1348,9 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( compiler.assembler().mark_after ( - new SetPC(compiler.assembler().get_label_constant(out_label)) - ), - in_label + new SetPC(compiler.assembler().get_label_constant(out_label)), + in_label + ) ); parameters = new ArrayList<Register>(); @@ -1364,18 +1366,10 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor compiler.registers().push_context(context_name); - result_holder = - reserve - ( - new PointerType - ( - TypeCompiler.compile - ( - compiler, - n.get_lambda_function().get_type() - ) - ) - ); + result_type = + TypeCompiler.compile(compiler, n.get_lambda_function().get_type()); + + result_holder = reserve(new PointerType(result_type)); parameters.add(result_holder); @@ -1387,7 +1381,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor parameters.add(r); - compiler.registers().bind(r, param.get_name()); + compiler.registers().bind(param.get_name(), r); } compiler.registers().read_parameters(parameters); @@ -1403,14 +1397,14 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( new SetValue ( - result_holder.get_value(), + new Address(result_holder.get_value(), result_type), expr_compiler.get_computation() ) ); init_instructions.addAll ( - compiler.registers().get_finalize_context_instructions(context_name) + compiler.registers().get_finalize_context_instructions() ); init_instructions.add @@ -1419,13 +1413,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( compiler.assembler().merge ( - compiler.registers().get_exit_context_instructions() + compiler.registers().get_leave_context_instructions() ), out_label ) ); - compiler.registers().pop_context(context_name); + compiler.registers().pop_context(); result_as_computation = compiler.assembler().get_label_constant(in_label); } @@ -1442,7 +1436,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor final Register result; final String return_to_label; - target_line_cc = new ComputationCompiler(); + parameters = new ArrayList<Computation>(); + target_line_cc = new ComputationCompiler(compiler); return_to_label = compiler.assembler().generate_label("<lambda_eval#return_to>"); @@ -1473,7 +1468,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor init_instructions.addAll ( - compiler.registers().store_parameters(parameters); + compiler.registers().store_parameters(parameters) ); init_instructions.add @@ -1485,7 +1480,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor compiler.registers().get_visit_context_instructions ( target_line_cc.get_computation(), - return_to_label + compiler.assembler().get_label_constant(return_to_label) ) ), return_to_label 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 e5d4342..961fd10 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 @@ -235,9 +235,13 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor { final Register r; - r = compiler.registers().reserve(n.get_type()); + r = + compiler.registers().reserve + ( + TypeCompiler.compile(compiler, n.get_variable().get_type()) + ); - compiler.registers().bind(r, n.get_name()); + compiler.registers().bind(n.get_variable().get_name(), r); } @Override @@ -1662,12 +1666,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { - final List<ComputationCompiler> parameters; + final List<ComputationCompiler> parameter_ccs; + final List<Computation> parameters; + final String return_to_label; return_to_label = compiler.assembler().generate_label("<seq_call#return_to>"); + parameter_ccs = new ArrayList<ComputationCompiler>(); parameters = new ArrayList<Computation>(); for @@ -1687,6 +1694,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } parameters.add(cc.get_computation()); + parameter_ccs.add(cc); } result.addAll(compiler.registers().store_parameters(parameters)); @@ -1703,14 +1711,14 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ( n.get_sequence_name() ), - return_to_label + compiler.assembler().get_label_constant(return_to_label) ) ), return_to_label ) ); - for (final ComputationCompiler cc: parameters) + for (final ComputationCompiler cc: parameter_ccs) { cc.release_registers(); } @@ -1723,8 +1731,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { - final List<ComputationCompiler> parameters; + final List<ComputationCompiler> parameter_ccs; + final List<Computation> parameters; + parameter_ccs = new ArrayList<ComputationCompiler>(); parameters = new ArrayList<Computation>(); for @@ -1744,6 +1754,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } parameters.add(cc.get_computation()); + parameter_ccs.add(cc); } result.addAll(compiler.registers().store_parameters(parameters)); @@ -1756,7 +1767,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) ); - for (final ComputationCompiler cc: parameters) + for (final ComputationCompiler cc: parameter_ccs) { cc.release_registers(); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java index 3c45e83..620188b 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java @@ -6,17 +6,20 @@ import java.util.Collection; import java.util.List; import java.util.ArrayList; +import tonkadur.wyrd.v1.lang.meta.Instruction; + import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.type.Type; class RegisterContext { - protected static final String name_prefix = ".anon."; + protected static final String default_name_prefix = ".anon."; protected final String name; protected final Map<String, Register> register_by_name; protected final Map<String, Register> aliased_registers; protected final Map<Type, List<Register>> anonymous_register_by_type; + protected final String name_prefix; protected int generated_registers; public RegisterContext (final String name) @@ -26,10 +29,28 @@ class RegisterContext register_by_name = new HashMap<String, Register>(); aliased_registers = new HashMap<String, Register>(); anonymous_register_by_type = new HashMap<Type, List<Register>>(); + name_prefix = default_name_prefix; generated_registers = 0; } + public RegisterContext (final String name, final String name_prefix) + { + this.name = name; + + register_by_name = new HashMap<String, Register>(); + aliased_registers = new HashMap<String, Register>(); + anonymous_register_by_type = new HashMap<Type, List<Register>>(); + this.name_prefix = name_prefix; + + generated_registers = 0; + } + + public String get_name () + { + return name; + } + public Collection<Register> get_all_registers () { return register_by_name.values(); @@ -141,4 +162,9 @@ class RegisterContext { return new Register(t, name); } + + public List<Instruction> get_finalize_instructions () + { + return new ArrayList(); + } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java index 50e63d1..155f6d5 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -16,12 +16,19 @@ import tonkadur.wyrd.v1.lang.meta.Computation; import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.ValueOf; +import tonkadur.wyrd.v1.lang.computation.Size; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.SetPC; +import tonkadur.wyrd.v1.lang.instruction.Remove; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.MapType; import tonkadur.wyrd.v1.lang.type.DictType; - public class RegisterManager { protected static final String context_name_prefix = ".context."; @@ -205,7 +212,7 @@ public class RegisterManager ); result.add(new Remove(return_to_address)); - result.add(new SetPC(next.pc.get_value())); + result.add(new SetPC(next_pc.get_value())); return result; } @@ -246,7 +253,7 @@ public class RegisterManager { final Register r; - r = parameters_context.reserve(p.get_type()); + r = parameter_context.reserve(p.get_type()); result.add(new SetValue(r.get_address(), p)); @@ -274,7 +281,7 @@ public class RegisterManager { final Register r; - r = parameters_context.reserve(p.get_type()); + r = parameter_context.reserve(p.get_type()); result.add(new SetValue(p.get_address(), r.get_value())); 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 6a7ce1d..3327e2c 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 @@ -14,9 +14,15 @@ import tonkadur.wyrd.v1.lang.meta.Computation; import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Operation; import tonkadur.wyrd.v1.lang.computation.RelativeAddress; import tonkadur.wyrd.v1.lang.computation.Constant; import tonkadur.wyrd.v1.lang.computation.Cast; +import tonkadur.wyrd.v1.lang.computation.New; +import tonkadur.wyrd.v1.lang.computation.ValueOf; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.Remove; import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.lang.type.PointerType; @@ -32,7 +38,7 @@ class StackableRegisterContext extends RegisterContext protected final Register context_stack_level; protected final Register context_stacks; protected final Address current_context_address_holder; - protected final Computation current_context_address; + protected final Address current_context_address; public StackableRegisterContext ( @@ -63,7 +69,12 @@ class StackableRegisterContext extends RegisterContext new PointerType(context_structure) ); - current_context_address = new ValueOf(current_context_address_holder); + current_context_address = + new Address + ( + new ValueOf(current_context_address_holder), + context_structure + ); } @Override @@ -110,7 +121,7 @@ class StackableRegisterContext extends RegisterContext new SetValue ( context_stack_level.get_address(), - Operation.plus(context_stack_level.get_value, Constant.ONE) + Operation.plus(context_stack_level.get_value(), Constant.ONE) ) ); @@ -126,6 +137,7 @@ class StackableRegisterContext extends RegisterContext return result; } + @Override public List<Instruction> get_finalize_instructions () { final List<Instruction> result; |


