summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-14 23:12:21 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-14 23:12:21 +0200
commit2c2199dcd2e6784fca93b42bcc2f6d7c9d8e2291 (patch)
tree50ed5c64e1d97c2d99940e6c0991bf05d24bae18
parente498c87926a76f21937af2e5b1b08e88f78178c1 (diff)
Hey, it compiles...
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java43
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java25
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java28
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java18
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;