From 82a2d5f3b45bfd071b3d4cf104c6e3e7a1526b27 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 20 Jul 2023 15:10:13 +0100 Subject: Load free variables in closure --- .../org/shedlang/compiler/patio/PatioSerializerTests.java | 10 ++++++++++ src/test/java/org/shedlang/compiler/patio/PatioTesting.java | 11 ++++++++++- .../java/org/shedlang/compiler/patio/instructions/Patio.java | 6 ++++++ 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index 857089fa..48e5a38e 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -18,6 +18,11 @@ public class PatioSerializerTests { var element = PatioFunctionDefinition.builder() .withName("f") .withIsPrivate(true) + .addParam(Patio.local("param1", PatioTypes.INT)) + .addParam(Patio.local("param2", PatioTypes.DATA_POINTER)) + .addLocal(Patio.local("local1", PatioTypes.FUNCTION_POINTER)) + .addLocal(Patio.local("local2", PatioTypes.INT)) + .addBodyInstruction(Patio.intGet("local2", 2)) .build(); var string = PatioTesting.serializeCompilationUnitElement(element); @@ -27,6 +32,11 @@ public class PatioSerializerTests { function "f" is-private=true + params=(("param1" int) ("param2" data-ptr)) + locals=(("local1" function-ptr) ("local2" int)) + body=( + (int-get "local2" 2) + ) )""" )); } diff --git a/src/test/java/org/shedlang/compiler/patio/PatioTesting.java b/src/test/java/org/shedlang/compiler/patio/PatioTesting.java index 8dd331e7..eb7c2d8d 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioTesting.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioTesting.java @@ -19,12 +19,21 @@ class PatioTesting { } builder.append("\n"); - builder.append("Locals:\n\n"); + builder.append("Locals:\n"); for (var local : context.functionContext().localsByName().values()) { builder.append(" * "); PatioSerializer.serializeLocal(local, builder); builder.append("\n"); } + builder.append("\n"); + + builder.append("Args:\n"); + for (var arg : context.functionContext().args()) { + builder.append(" * "); + builder.append(arg.name()); + builder.append("\n"); + } + builder.append("\n"); builder.append("Instructions:\n\n"); PatioSerializer.serializeInstructions( diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index c3ba0270..5ad05faf 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -1,8 +1,10 @@ package org.shedlang.compiler.patio.instructions; +import org.shedlang.compiler.patio.ast.PatioLocal; import org.shedlang.compiler.patio.ast.PatioLocalRef; import org.shedlang.compiler.patio.ast.instructions.*; import org.shedlang.compiler.patio.ast.types.PatioDataLayout; +import org.shedlang.compiler.patio.ast.types.PatioType; import org.shedlang.compiler.sources.Sources; import java.util.List; @@ -45,6 +47,10 @@ public class Patio { return new PatioIntGet(new PatioLocalRef(target), value, Sources.NULL); } + public static PatioLocal local(String name, PatioType type) { + return new PatioLocal(name, type); + } + public static PatioInstruction localCopy(String target, String value) { return new PatioLocalCopy( new PatioLocalRef(target), -- cgit v1.2.3