summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java78
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java97
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java16
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java28
4 files changed, 171 insertions, 48 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 bbdb47c..6115e6e 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
@@ -1336,21 +1336,36 @@ 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 String context_name;
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();
compiler.registers().create_stackable_context(context_name);
+ init_instructions.addAll
+ (
+ compiler.registers().get_initialize_context_instructions(context_name)
+ );
+
compiler.registers().push_context(context_name);
result_holder =
- compiler.registers().reserve
+ reserve
(
new PointerType
(
@@ -1364,18 +1379,55 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
parameters.add(result_holder);
- for (final
+ for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters())
+ {
+ final Register r;
+
+ r = reserve(TypeCompiler.compile(compiler, param.get_type()));
+
+ parameters.add(r);
+
+ compiler.registers().bind(r, param.get_name());
+ }
+
compiler.registers().read_parameters(parameters);
- /* create new context */
- /* push context */
- /* (mark_after (setpc (label out)) (label in)) */
- /* cc = compile lambda_expression */
- /* (set result = cc.get_result())
- /* (mark_after (merge (exit_instr)) (label out)) */
- /* pop context */
- /* result = (label in) */
+ expr_compiler = new ComputationCompiler(compiler);
+
+ n.get_lambda_function().get_visited_by(expr_compiler);
+
+ assimilate(expr_compiler);
+
+ init_instructions.add
+ (
+ new SetValue
+ (
+ result_holder.get_value(),
+ expr_compiler.get_computation()
+ )
+ );
+
+ init_instructions.addAll
+ (
+ compiler.registers().get_finalize_context_instructions(context_name)
+ );
+
+ init_instructions.add
+ (
+ compiler.assembler().mark_after
+ (
+ compiler.assembler().merge
+ (
+ compiler.registers().get_exit_context_instructions()
+ ),
+ out_label
+ )
+ );
+
+ compiler.registers().pop_context(context_name);
+
+ result_as_computation = compiler.assembler().get_label_constant(in_label);
}
@Override
@@ -1399,11 +1451,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
assimilate(target_line_cc);
- result =
- compiler.registers().reserve
- (
- TypeCompiler.compile(compiler, n.get_type())
- );
+ result = reserve(TypeCompiler.compile(compiler, n.get_type()));
parameters.add(result.get_address());
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 2459f2a..e5d4342 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
@@ -1662,11 +1662,58 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
throws Throwable
{
- /* TODO */
- /* ... handle parameters ... */
+ final List<ComputationCompiler> parameters;
+ final String return_to_label;
- /* init target seq */
- /* enter target seq */
+ return_to_label =
+ compiler.assembler().generate_label("<seq_call#return_to>");
+
+ parameters = new ArrayList<Computation>();
+
+ for
+ (
+ final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters()
+ )
+ {
+ final ComputationCompiler cc;
+
+ cc = new ComputationCompiler(compiler);
+
+ param.get_visited_by(cc);
+
+ if (cc.has_init())
+ {
+ result.add(cc.get_init());
+ }
+
+ parameters.add(cc.get_computation());
+ }
+
+ result.addAll(compiler.registers().store_parameters(parameters));
+
+ result.add
+ (
+ compiler.assembler().mark_after
+ (
+ compiler.assembler().merge
+ (
+ compiler.registers().get_visit_context_instructions
+ (
+ compiler.assembler().get_label_constant
+ (
+ n.get_sequence_name()
+ ),
+ return_to_label
+ )
+ ),
+ return_to_label
+ )
+ );
+
+ for (final ComputationCompiler cc: parameters)
+ {
+ cc.release_registers();
+ }
}
@Override
@@ -1676,22 +1723,42 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
throws Throwable
{
- /* TODO */
- final String sequence_name;
-
- sequence_name = n.get_sequence_name();
+ final List<ComputationCompiler> parameters;
- /* ... handle parameters ... */
+ parameters = new ArrayList<Computation>();
- if (compiler.registers().get_current_context_name().equals(sequence_name))
+ for
+ (
+ final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters()
+ )
{
- /* Special case, we morph into it. */
+ final ComputationCompiler cc;
+
+ cc = new ComputationCompiler(compiler);
+
+ param.get_visited_by(cc);
+
+ if (cc.has_init())
+ {
+ result.add(cc.get_init());
+ }
+
+ parameters.add(cc.get_computation());
}
- else
+
+ result.addAll(compiler.registers().store_parameters(parameters));
+
+ result.addAll
+ (
+ compiler.registers().get_jump_to_context_instructions
+ (
+ compiler.assembler().get_label_constant(n.get_sequence_name())
+ )
+ );
+
+ for (final ComputationCompiler cc: parameters)
{
- /* init target seq */
- /* finalize current seq */
- /* jump to current seq */
+ cc.release_registers();
}
}
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 6dd9401..50e63d1 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
@@ -172,23 +172,11 @@ public class RegisterManager
public List<Instruction> get_initialize_context_instructions
(
- final String context_name,
- final List<Computation> parameters
+ final String context_name
)
{
return
- context_by_name.get(context_name).get_initialize_instructions
- (
- parameters
- );
- }
-
- public List<Instruction> get_morph_into_context_instructions
- (
- final List<Computation> parameters
- )
- {
- return context.peekFirst().get_morph_into_instructions(parameters);
+ context_by_name.get(context_name).get_initialize_instructions();
}
public String get_current_context_name ()
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 d099e8e..6a7ce1d 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
@@ -73,8 +73,7 @@ class StackableRegisterContext extends RegisterContext
if (context_structure.get_fields().get(name) != null)
{
- ;
- System.err.println
+ System.err.println
(
"[P] Duplicate register '"
+ name
@@ -102,8 +101,29 @@ class StackableRegisterContext extends RegisterContext
public List<Instruction> get_initialize_instructions ()
{
- /* TODO */
- return new ArrayList<>();
+ final List<Instruction> result;
+
+ result = new ArrayList<Instruction>();
+
+ result.add
+ (
+ new SetValue
+ (
+ context_stack_level.get_address(),
+ Operation.plus(context_stack_level.get_value, Constant.ONE)
+ )
+ );
+
+ result.add
+ (
+ new SetValue
+ (
+ current_context_address_holder,
+ new New(context_structure)
+ )
+ );
+
+ return result;
}
public List<Instruction> get_finalize_instructions ()