summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-10-24 02:15:13 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-10-24 02:15:13 +0200
commit4b86ef77955f5bb4f134252c15ef30fd51a243c3 (patch)
tree33d7e33bb799c72feda9bfaf0df8fcee2c51a180 /src/core
parent87b3ce9b51499ac51027fcdd5cd971a16e5e844a (diff)
Fixes lambda functions not always working.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java65
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java2
2 files changed, 36 insertions, 31 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 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("<lambda_expr#out>");
@@ -744,7 +744,32 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
parameters = new ArrayList<Register>();
side_channel_parameters = new ArrayList<Register>();
- 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();