aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-30 13:31:25 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-30 13:33:23 +0100
commit3b71fb59ab9613d73733d6c82cac8ddd74bb5101 (patch)
tree2364b1daea2f7b609ea3cddb8da91dcfe39c41fd /src/main/java
parent209cafc729a344efa002c545cae1f944061709d3 (diff)
Store params and vals as locals in Patio
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java22
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java36
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java14
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java143
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java6
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenStrings.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java6
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java25
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java12
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java19
11 files changed, 156 insertions, 140 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
index 96866b50..e74651bd 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -17,6 +17,7 @@ import org.shedlang.compiler.util.P;
import java.util.List;
import java.util.Optional;
+import java.util.stream.StreamSupport;
public class LlvmPatioCodeGen {
public static LlvmModule generateCompilationUnit(PatioCompilationUnit patioCompilationUnit) {
@@ -125,11 +126,7 @@ public class LlvmPatioCodeGen {
) {
var functionContext = context.enterFunction();
- var patioLocals = Lists.concat(
- patioFunctionDefinition.params(),
- patioFunctionDefinition.locals()
- );
- for (var patioLocal : patioLocals) {
+ for (var patioLocal : patioFunctionDefinition.locals()) {
functionContext = functionContext.addPatioLocalToType(
patioLocal.ref(),
patioTypeToLlvmType(patioLocal.type())
@@ -153,7 +150,7 @@ public class LlvmPatioCodeGen {
return context.addTopLevelEntity(new LlvmFunctionDefinition(
patioFunctionDefinition.name(),
patioTypeToLlvmType(patioFunctionDefinition.returnType()),
- patioFunctionDefinition.params().stream()
+ StreamSupport.stream(patioFunctionDefinition.params().spliterator(), false)
.map(patioParam -> new LlvmParam(
patioTypeToLlvmType(patioParam.type()),
patioParam.name()
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
index f7b5d8c8..5d6111ed 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -17,6 +17,7 @@ import org.shedlang.compiler.util.P;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.util.ArrayList;
import java.util.List;
public class WasmPatioCodeGen {
@@ -71,13 +72,20 @@ public class WasmPatioCodeGen {
case PatioFunctionDefinition patioFunctionDefinition -> {
var name = patioFunctionDefinition.name();
- var wasmParams = patioFunctionDefinition.params().stream()
- .map(param -> patioLocalToWasmLocal(param))
- .toList();
-
- var wasmLocals = patioFunctionDefinition.locals().stream()
- .map(local -> patioLocalToWasmLocal(local))
- .toList();
+ var wasmParams = new ArrayList<WasmLocal>();
+ var wasmLocals = new ArrayList<WasmLocal>();
+
+ for (var patioLocal : patioFunctionDefinition.locals()) {
+ var wasmLocal = patioLocalToWasmLocal(patioLocal);
+ switch (patioLocal) {
+ case PatioLocal.Param patioParam -> {
+ wasmParams.add(wasmLocal);
+ }
+ case PatioLocal.Val patioVal -> {
+ wasmLocals.add(wasmLocal);
+ }
+ }
+ }
var wasmResultTypes = patioTypeToWasmResultTypes(patioFunctionDefinition.returnType());
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index 11189e7b..e11f5dd1 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -39,7 +39,7 @@ public class PatioCodeGen {
PatioTypes.INT,
source,
mainContext -> {
- var namespaceValueResult = mainContext.allocateLocal(
+ var namespaceValueResult = mainContext.allocateVal(
PatioCodeGenLocalSpace.NAMESPACE_VALUE,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -53,7 +53,7 @@ public class PatioCodeGen {
mainContext
);
- var mainFieldResult = mainContext.allocateLocal(
+ var mainFieldResult = mainContext.allocateVal(
PatioCodeGenLocalSpace.MAIN,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -70,7 +70,7 @@ public class PatioCodeGen {
mainContext
);
- var exitCodeResult = mainContext.allocateLocal(
+ var exitCodeResult = mainContext.allocateVal(
PatioCodeGenLocalSpace.MAIN,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -131,7 +131,7 @@ public class PatioCodeGen {
case CallInstruction call -> {
var namedArgsByName = new ArrayList<Map.Entry<String, PatioLocalRef>>();
for (var argName : reversed(call.namedArgNames())) {
- var argResult = context.allocateLocal(
+ var argResult = context.allocateVal(
PatioCodeGenLocalSpace.CALL_ARG_NAMED,
argName,
PatioCodeGenTypes.VALUE_TYPE
@@ -149,7 +149,7 @@ public class PatioCodeGen {
var positionalArgs = new ArrayList<PatioLocalRef>();
for (var i = 0; i < call.positionalArgCount(); i++) {
- var argResult = context.allocateLocal(
+ var argResult = context.allocateVal(
PatioCodeGenLocalSpace.CALL_ARG_POSITIONAL,
Integer.toString(call.positionalArgCount() - i - 1),
PatioCodeGenTypes.VALUE_TYPE
@@ -166,7 +166,7 @@ public class PatioCodeGen {
}
Collections.reverse(positionalArgs);
- var receiverResult = context.allocateLocal(
+ var receiverResult = context.allocateVal(
PatioCodeGenLocalSpace.RECEIVER,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -178,7 +178,7 @@ public class PatioCodeGen {
stackIrInstruction.source()
);
- var targetResult = context.allocateLocal(
+ var targetResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -196,7 +196,7 @@ public class PatioCodeGen {
}
case DefineFunctionInstruction defineFunction -> {
- var targetResult = context.allocateLocal(
+ var targetResult = context.allocateVal(
PatioCodeGenLocalSpace.CLOSURE,
defineFunction.name(),
PatioCodeGenTypes.VALUE_TYPE
@@ -229,7 +229,7 @@ public class PatioCodeGen {
var receiver = receiverResult.value();
context = receiverResult.context();
- var targetResult = context.allocateLocal(
+ var targetResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
fieldLoad.fieldName(),
PatioCodeGenTypes.VALUE_TYPE
@@ -252,7 +252,7 @@ public class PatioCodeGen {
}
case IfInstruction if_ -> {
- var conditionIntResult = context.allocateLocal(
+ var conditionIntResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
"conditionInt",
PatioTypes.INT
@@ -262,7 +262,7 @@ public class PatioCodeGen {
context = context.temporaryPopIntoLocal(conditionInt, if_.source());
- var conditionBoolResult = context.allocateLocal(
+ var conditionBoolResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
"conditionBool",
PatioTypes.BOOL
@@ -276,7 +276,7 @@ public class PatioCodeGen {
if_.source()
));
- var valueResult = context.allocateLocal(
+ var valueResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -361,7 +361,7 @@ public class PatioCodeGen {
}
case LocalStoreInstruction localStore ->
- context.addStackIrLocal(
+ context.addStackIrVal(
localStore.name(),
(local, c) -> c.temporaryPopIntoLocal(local, localStore.source())
);
@@ -383,7 +383,7 @@ public class PatioCodeGen {
}
case NamespaceImportInstruction namespaceImport -> {
- var namespaceValueResult = context.allocateLocal(
+ var namespaceValueResult = context.allocateVal(
PatioCodeGenLocalSpace.NAMESPACE_VALUE,
PatioCodeGenNamespaces.NAMESPACE_VALUE_TYPE
);
@@ -417,7 +417,7 @@ public class PatioCodeGen {
var stringPtrOperand = stringPtrOperandResult.value();
context = stringPtrOperandResult.context();
- var stringPtrResult = context.allocateLocal(
+ var stringPtrResult = context.allocateVal(
PatioCodeGenLocalSpace.STRING,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -477,7 +477,7 @@ public class PatioCodeGen {
) {
return generateBinaryOperation(
(target, left, right, operationContext) -> {
- var targetBoolResult = operationContext.allocateLocal(
+ var targetBoolResult = operationContext.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
PatioTypes.INT
);
@@ -515,7 +515,7 @@ public class PatioCodeGen {
var left = leftResult.value();
context = leftResult.context();
- var targetResult = context.allocateLocal(
+ var targetResult = context.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
PatioCodeGenTypes.VALUE_TYPE
);
@@ -554,7 +554,7 @@ public class PatioCodeGen {
}
private static PatioCodeGenContext pushValue(int value, Source source, PatioCodeGenContext context) {
- var localResult = context.allocateLocal(PatioCodeGenLocalSpace.TEMPORARY, PatioCodeGenTypes.VALUE_TYPE);
+ var localResult = context.allocateVal(PatioCodeGenLocalSpace.TEMPORARY, PatioCodeGenTypes.VALUE_TYPE);
var local = localResult.value();
context = localResult.context();
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
index c0cb41ea..cba3b17b 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
@@ -64,23 +64,21 @@ class PatioCodeGenClosures {
context = fullNameResult.context();
context = context.createFunction(fullName, PatioVisibility.PRIVATE, PatioCodeGenTypes.VALUE_TYPE, source, bodyContext -> {
- var closurePointerResult = bodyContext.allocateLocal(
+ var closurePointerResult = bodyContext.allocateParam(
PatioCodeGenLocalSpace.CLOSURE_POINTER,
CLOSURE_POINTER_TYPE
);
var closurePointer = closurePointerResult.value();
bodyContext = closurePointerResult.context();
- bodyContext = bodyContext.addArg(closurePointer);
-
var stackIrParams = Stream.concat(positionalParams.stream(), namedParams.stream()).toList();
for (var stackIrParam : stackIrParams) {
- bodyContext = bodyContext.addStackIrArg(stackIrParam.name());
+ bodyContext = bodyContext.addStackIrParam(stackIrParam.name());
}
for (var freeVariable : freeVariables) {
- bodyContext = bodyContext.addStackIrLocal(
+ bodyContext = bodyContext.addStackIrVal(
freeVariable.name(),
(freeVariableLocal, c) -> c.addInstruction(new PatioMemoryLoad(
freeVariableLocal,
@@ -97,7 +95,7 @@ class PatioCodeGenClosures {
return bodyContext;
});
- var closurePointerResult = context.allocateLocal(
+ var closurePointerResult = context.allocateVal(
PatioCodeGenLocalSpace.CLOSURE_POINTER,
name,
PatioTypes.DATA_POINTER
@@ -146,7 +144,7 @@ class PatioCodeGenClosures {
Source source,
PatioCodeGenContext context
) {
- var closurePointerResult = context.allocateLocal(
+ var closurePointerResult = context.allocateVal(
PatioCodeGenLocalSpace.CLOSURE_POINTER,
CLOSURE_POINTER_TYPE
);
@@ -159,7 +157,7 @@ class PatioCodeGenClosures {
source
));
- var functionPointerResult = context.allocateLocal(
+ var functionPointerResult = context.allocateVal(
PatioCodeGenLocalSpace.CALL_FUNCTION_POINTER,
PatioTypes.FUNCTION_POINTER
);
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
index 17052735..ecec3aee 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
@@ -87,16 +87,14 @@ public record PatioCodeGenContext(
PVector<PatioInstruction> instructions,
OrderedPMap<String, PatioLocal> localsByName,
PMap<String, PatioLocalRef> stackIrNameToLocal,
- PMap<String, PVector<Function<PatioCodeGenContext, PatioCodeGenContext>>> waitingForStackIrLocal,
- PVector<PatioLocalRef> args
+ PMap<String, PVector<Function<PatioCodeGenContext, PatioCodeGenContext>>> waitingForStackIrLocal
) {
public static final FunctionContext EMPTY = new FunctionContext(
P.stack(),
P.vector(),
OrderedPMap.empty(),
P.map(),
- P.map(),
- P.vector()
+ P.map()
);
public Result<PatioLocalRef> temporaryPop() {
@@ -105,8 +103,7 @@ public record PatioCodeGenContext(
this.instructions,
this.localsByName,
this.stackIrNameToLocal,
- this.waitingForStackIrLocal,
- this.args
+ this.waitingForStackIrLocal
).toResult(this.temporaryStack.get(0));
}
@@ -116,8 +113,7 @@ public record PatioCodeGenContext(
this.instructions,
this.localsByName,
this.stackIrNameToLocal,
- this.waitingForStackIrLocal,
- this.args
+ this.waitingForStackIrLocal
);
}
@@ -127,15 +123,15 @@ public record PatioCodeGenContext(
this.instructions.plus(instruction),
this.localsByName,
this.stackIrNameToLocal,
- this.waitingForStackIrLocal,
- this.args
+ this.waitingForStackIrLocal
);
}
public Result<PatioLocalRef> allocateLocal(
PatioCodeGenLocalSpace space,
Optional<String> name,
- PatioType type
+ PatioType type,
+ PatioLocalFactory createLocal
) {
var fullName = NameAllocator.allocateName(
this.localsByName::containsKey,
@@ -146,14 +142,16 @@ public record PatioCodeGenContext(
return new FunctionContext(
this.temporaryStack,
this.instructions,
- this.localsByName.plus(fullName, new PatioLocal(fullName, type)),
+ this.localsByName.plus(fullName, createLocal.create(fullName, type)),
this.stackIrNameToLocal,
- this.waitingForStackIrLocal,
- this.args
+ this.waitingForStackIrLocal
).toResult(new PatioLocalRef(fullName));
}
- public Result<PVector<Function<PatioCodeGenContext, PatioCodeGenContext>>> addStackIrLocal(String name) {
+ public Result<PVector<Function<PatioCodeGenContext, PatioCodeGenContext>>> addStackIrLocal(
+ String name,
+ PatioLocalFactory createLocal
+ ) {
var context = this;
if (this.stackIrNameToLocal.containsKey(name)) {
@@ -174,12 +172,11 @@ public record PatioCodeGenContext(
this.instructions,
this.localsByName.plus(
fullName,
- new PatioLocal(fullName, PatioCodeGenTypes.VALUE_TYPE)
+ createLocal.create(fullName, PatioCodeGenTypes.VALUE_TYPE)
),
// TODO: the mapping is redundant given we fix the mapping
this.stackIrNameToLocal.plus(name, localRef),
- this.waitingForStackIrLocal.minus(name),
- this.args
+ this.waitingForStackIrLocal.minus(name)
);
return context.toResult(this.waitingForStackIrLocal.getOrDefault(name, P.vector()));
@@ -214,19 +211,7 @@ public record PatioCodeGenContext(
this.waitingForStackIrLocal.plus(
name,
this.waitingForStackIrLocal.getOrDefault(name, P.vector()).plus(func)
- ),
- this.args
- );
- }
-
- public FunctionContext addArg(PatioLocalRef local) {
- return new FunctionContext(
- this.temporaryStack,
- this.instructions,
- this.localsByName,
- this.stackIrNameToLocal,
- this.waitingForStackIrLocal,
- this.args.plus(local)
+ )
);
}
@@ -314,37 +299,83 @@ public record PatioCodeGenContext(
return withFunctionContext(this.functionContext.addInstruction(instruction));
}
- public PatioCodeGenResult<PatioLocalRef> allocateLocal(
+ public PatioCodeGenResult<PatioLocalRef> allocateParam(
+ PatioCodeGenLocalSpace space,
+ PatioType type
+ ) {
+ var result = this.functionContext.allocateLocal(
+ space,
+ Optional.empty(),
+ type,
+ PatioLocal.Param::new
+ );
+
+ return withFunctionContextResult(result);
+ }
+
+ public PatioCodeGenResult<PatioLocalRef> allocateParam(
PatioCodeGenLocalSpace space,
String name,
PatioType type
) {
- var result = this.functionContext.allocateLocal(space, Optional.of(name), type);
+ var result = this.functionContext.allocateLocal(
+ space,
+ Optional.of(name),
+ type,
+ PatioLocal.Param::new
+ );
return withFunctionContextResult(result);
}
- public PatioCodeGenResult<PatioLocalRef> allocateLocal(
+ public PatioCodeGenResult<PatioLocalRef> allocateVal(
PatioCodeGenLocalSpace space,
PatioType type
) {
- var result = this.functionContext.allocateLocal(space, Optional.empty(), type);
+ var result = this.functionContext.allocateLocal(
+ space,
+ Optional.empty(),
+ type,
+ PatioLocal.Val::new
+ );
return withFunctionContextResult(result);
}
- public PatioCodeGenContext addStackIrArg(String name) {
- return addStackIrLocal(
- name,
- (local, c) -> c.addArg(local)
+ public PatioCodeGenResult<PatioLocalRef> allocateVal(
+ PatioCodeGenLocalSpace space,
+ String name,
+ PatioType type
+ ) {
+ var result = this.functionContext.allocateLocal(
+ space,
+ Optional.of(name),
+ type,
+ PatioLocal.Val::new
);
+
+ return withFunctionContextResult(result);
}
- public PatioCodeGenContext addStackIrLocal(
+ public PatioCodeGenContext addStackIrParam(
+ String name
+ ) {
+ return addStackIrLocal(name, (l, c) -> c, PatioLocal.Param::new);
+ }
+
+ public PatioCodeGenContext addStackIrVal(
String name,
BiFunction<PatioLocalRef, PatioCodeGenContext, PatioCodeGenContext> setLocal
) {
- var result = this.functionContext.addStackIrLocal(name);
+ return addStackIrLocal(name, setLocal, PatioLocal.Val::new);
+ }
+
+ public PatioCodeGenContext addStackIrLocal(
+ String name,
+ BiFunction<PatioLocalRef, PatioCodeGenContext, PatioCodeGenContext> setLocal,
+ PatioLocalFactory createLocal
+ ) {
+ var result = this.functionContext.addStackIrLocal(name, createLocal);
var context = withFunctionContext(result.context);
var patioLocal = context.functionContext.stackIrLocalNameToLocal(name);
@@ -377,10 +408,6 @@ public record PatioCodeGenContext(
return this.functionContext.stackIrLocalNameToLocal(name);
}
- public PatioCodeGenContext addArg(PatioLocalRef local) {
- return withFunctionContext(this.functionContext.addArg(local));
- }
-
public PatioCodeGenContext createFunction(
String name,
PatioVisibility visibility,
@@ -396,22 +423,12 @@ public record PatioCodeGenContext(
bodyContext = createBody.apply(bodyContext);
- var params = new ArrayList<PatioLocal>();
- var locals = new ArrayList<PatioLocal>();
-
- for (var local : bodyContext.functionContext.localsByName.values()) {
- if (bodyContext.functionContext.args.contains(new PatioLocalRef(local.name()))) {
- params.add(local);
- } else {
- locals.add(local);
- }
- }
+ var locals = bodyContext.functionContext.localsByName.values().stream().toList();
return new PatioCodeGenContext(
bodyContext.compilationUnitContext.addElement(new PatioFunctionDefinition(
name,
visibility,
- params,
locals,
returnType,
bodyContext.functionContext.instructions,
@@ -431,17 +448,12 @@ public record PatioCodeGenContext(
P.vector(),
this.functionContext.localsByName,
this.functionContext.stackIrNameToLocal,
- this.functionContext.waitingForStackIrLocal,
- P.vector()
+ this.functionContext.waitingForStackIrLocal
)
);
}
public PatioCodeGenResult<List<PatioInstruction>> exitBlock() {
- if (!this.functionContext.args.isEmpty()) {
- throw new RuntimeException("cannot add args in block");
- }
-
if (!this.functionContext.temporaryStack.isEmpty()) {
throw new RuntimeException("temporary stack must be empty at the end of a block");
}
@@ -454,8 +466,7 @@ public record PatioCodeGenContext(
this.blockStack.get(0).instructions,
this.functionContext.localsByName,
this.functionContext.stackIrNameToLocal,
- this.functionContext.waitingForStackIrLocal,
- this.blockStack.get(0).args
+ this.functionContext.waitingForStackIrLocal
)
).toResult(this.functionContext.instructions);
}
@@ -486,4 +497,8 @@ public record PatioCodeGenContext(
source
);
}
+
+ private interface PatioLocalFactory {
+ PatioLocal create(String name, PatioType type);
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index afec18f4..e87adb5e 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -75,7 +75,7 @@ public class PatioCodeGenNamespaces {
NAMESPACE_VALUE_TYPE,
source,
importContext -> {
- var isInitedResult = importContext.allocateLocal(
+ var isInitedResult = importContext.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
PatioTypes.BOOL
);
@@ -113,7 +113,7 @@ public class PatioCodeGenNamespaces {
source
));
- var namespaceValueResult = importContext.allocateLocal(
+ var namespaceValueResult = importContext.allocateVal(
PatioCodeGenLocalSpace.TEMPORARY,
NAMESPACE_VALUE_TYPE
);
@@ -174,7 +174,7 @@ public class PatioCodeGenNamespaces {
var namespaceTypeInfo = context.namespaceTypeInfo(namespaceName);
var layout = namespaceDataLayout(namespaceTypeInfo);
- var namespacePointerResult = context.allocateLocal(
+ var namespacePointerResult = context.allocateVal(
PatioCodeGenLocalSpace.NAMESPACE_POINTER,
namespaceNameToPatioIdentifier(namespaceName),
PatioTypes.DATA_POINTER
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStrings.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStrings.java
index 098d0296..a1de8092 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStrings.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStrings.java
@@ -63,8 +63,8 @@ public class PatioCodeGenStrings {
context = context.addCompilationUnitElement(new PatioFunctionDeclaration(
runtimeAddName,
List.of(
- new PatioLocal("left", PatioCodeGenTypes.VALUE_TYPE),
- new PatioLocal("right", PatioCodeGenTypes.VALUE_TYPE)
+ new PatioLocal.Param("left", PatioCodeGenTypes.VALUE_TYPE),
+ new PatioLocal.Param("right", PatioCodeGenTypes.VALUE_TYPE)
),
PatioCodeGenTypes.VALUE_TYPE,
source
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java
index 28810b5e..13b505b4 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDeclaration.java
@@ -11,7 +11,7 @@ import java.util.List;
public record PatioFunctionDeclaration(
String name,
- List<PatioLocal> params,
+ List<PatioLocal.Param> params,
PatioType returnType,
Source source
) implements PatioCompilationUnitElement {
@@ -25,7 +25,7 @@ public record PatioFunctionDeclaration(
public record Builder(
String name,
- PVector<PatioLocal> params,
+ PVector<PatioLocal.Param> params,
PatioType returnType
) {
public Builder withName(String name) {
@@ -36,7 +36,7 @@ public record PatioFunctionDeclaration(
);
}
- public Builder addParam(PatioLocal param) {
+ public Builder addParam(PatioLocal.Param param) {
return new Builder(
this.name,
this.params.plus(param),
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
index 78bb2b33..16790151 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioFunctionDefinition.java
@@ -6,6 +6,7 @@ import org.shedlang.compiler.patio.ast.types.PatioType;
import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.util.Iterables;
import org.shedlang.compiler.util.P;
import java.util.List;
@@ -13,18 +14,20 @@ import java.util.List;
public record PatioFunctionDefinition(
String name,
PatioVisibility visibility,
- List<PatioLocal> params,
List<PatioLocal> locals,
PatioType returnType,
List<PatioInstruction> body,
Source source
) implements PatioCompilationUnitElement {
+ public Iterable<PatioLocal.Param> params() {
+ return Iterables.filterToType(locals, PatioLocal.Param.class);
+ }
+
public static Builder builder() {
return new Builder(
"f",
PatioVisibility.PRIVATE,
P.vector(),
- P.vector(),
PatioTypes.INT,
P.vector()
);
@@ -33,7 +36,6 @@ public record PatioFunctionDefinition(
public record Builder(
String name,
PatioVisibility visibility,
- PVector<PatioLocal> params,
PVector<PatioLocal> locals,
PatioType returnType,
PVector<PatioInstruction> body
@@ -42,7 +44,6 @@ public record PatioFunctionDefinition(
return new Builder(
name,
this.visibility,
- this.params,
this.locals,
this.returnType,
this.body
@@ -53,18 +54,6 @@ public record PatioFunctionDefinition(
return new Builder(
this.name,
visibility,
- this.params,
- this.locals,
- this.returnType,
- this.body
- );
- }
-
- public Builder addParam(PatioLocal param) {
- return new Builder(
- this.name,
- this.visibility,
- this.params.plus(param),
this.locals,
this.returnType,
this.body
@@ -75,7 +64,6 @@ public record PatioFunctionDefinition(
return new Builder(
this.name,
this.visibility,
- this.params,
this.locals.plus(local),
this.returnType,
this.body
@@ -86,7 +74,6 @@ public record PatioFunctionDefinition(
return new Builder(
this.name,
this.visibility,
- this.params,
this.locals,
this.returnType,
this.body.plus(instruction)
@@ -97,7 +84,6 @@ public record PatioFunctionDefinition(
return new Builder(
this.name,
this.visibility,
- this.params,
this.locals,
returnType,
this.body
@@ -108,7 +94,6 @@ public record PatioFunctionDefinition(
return new PatioFunctionDefinition(
this.name,
this.visibility,
- this.params,
this.locals,
this.returnType,
this.body,
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
index eda09d2c..24f32ca4 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
@@ -3,8 +3,14 @@ package org.shedlang.compiler.patio.ast;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
import org.shedlang.compiler.patio.ast.types.PatioType;
-public record PatioLocal(String name, PatioType type) {
- public PatioLocalRef ref() {
- return new PatioLocalRef(name);
+public sealed interface PatioLocal {
+ String name();
+ PatioType type();
+
+ record Param(String name, PatioType type) implements PatioLocal {}
+ record Val(String name, PatioType type) implements PatioLocal {}
+
+ default PatioLocalRef ref() {
+ return new PatioLocalRef(name());
}
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index 74165bdc..3fd95306 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -112,11 +112,6 @@ public class PatioSerializer {
treeIdentifier("function"),
treeString(element.name()),
treeNamed("visibility", visibilityToTree(functionDefinition.visibility())),
- treeNamed("params", treeList(
- functionDefinition.params().stream()
- .map(param -> localToTree(param))
- .toList()
- )),
treeNamed("locals", treeList(
functionDefinition.locals().stream()
.map(local -> localToTree(local))
@@ -307,7 +302,19 @@ public class PatioSerializer {
}
private static Tree localToTree(PatioLocal local) {
- return treeList(treeString(local.name()), typeToTree(local.type()));
+ var localType = switch (local) {
+ case PatioLocal.Param param ->
+ "param";
+
+ case PatioLocal.Val val ->
+ "val";
+ };
+
+ return treeList(
+ treeIdentifier(localType),
+ treeString(local.name()),
+ typeToTree(local.type())
+ );
}
private static Tree optionalOperandToTree(Optional<PatioLocalRef> target) {