From 4b86ef77955f5bb4f134252c15ef30fd51a243c3 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sun, 24 Oct 2021 02:15:13 +0200 Subject: Fixes lambda functions not always working. --- .../v1/compiler/fate/v1/ComputationCompiler.java | 65 ++++++++++++---------- .../generic/LambdaEvaluationCompiler.java | 2 +- 2 files changed, 36 insertions(+), 31 deletions(-) (limited to 'src/core') 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 ac905d0..948542c 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 @@ -734,8 +734,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor final ComputationCompiler expr_compiler; final Type result_type; final String context_name; - final Register lambda_data_register; - final Address lambda_function_line_address; + final Register result, lambda_data_register; + final Address result_line_address; int i; out_label = compiler.assembler().generate_label(""); @@ -744,7 +744,32 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor parameters = new ArrayList(); side_channel_parameters = new ArrayList(); - lambda_data_register = reserve(DictType.WILD); + result = reserve(DictType.WILD); + + result_line_address = + new RelativeAddress + ( + result.get_address(), + Constant.string_value("l"), + Type.INT + ); + + init_instructions.add + ( + new Initialize(result_line_address, Type.INT) + ); + + init_instructions.add + ( + new SetValue + ( + result_line_address, + compiler.assembler().get_label_constant(in_label) + ) + ); + + result_as_computation = result.get_value(); + result_as_address = result.get_address(); context_name = compiler.registers().create_stackable_context_name(); @@ -784,12 +809,16 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor init_instructions ); + lambda_data_register = + compiler.registers().reserve + ( + DictType.WILD, + init_instructions + ); + side_channel_parameters.add(result_holder); side_channel_parameters.add(lambda_data_register); - // TODO: read two params: - // - result holder - // - wild dict, where the real params are. init_instructions.addAll ( compiler.registers().read_parameters(side_channel_parameters) @@ -881,30 +910,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor compiler.registers().pop_context(); - lambda_function_line_address = - new RelativeAddress - ( - lambda_data_register.get_address(), - Constant.string_value("l"), - Type.INT - ); - - init_instructions.add - ( - new Initialize(lambda_function_line_address, Type.INT) - ); - - init_instructions.add - ( - new SetValue - ( - lambda_function_line_address, - compiler.assembler().get_label_constant(in_label) - ) - ); - - result_as_computation = lambda_data_register.get_value(); - result_as_address = lambda_data_register.get_address(); } @Override diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java index 825491d..179d554 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java @@ -54,7 +54,7 @@ public class LambdaEvaluationCompiler extends GenericComputationCompiler assimilate(lambda_cc); - result = reserve(DictType.WILD); + result = reserve(TypeCompiler.compile(compiler, source.get_type())); result_as_address = result.get_address(); result_as_computation = result.get_value(); -- cgit v1.2.3-70-g09d2