diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-30 13:31:25 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-30 13:33:23 +0100 |
| commit | 3b71fb59ab9613d73733d6c82cac8ddd74bb5101 (patch) | |
| tree | 2364b1daea2f7b609ea3cddb8da91dcfe39c41fd /src/main/java | |
| parent | 209cafc729a344efa002c545cae1f944061709d3 (diff) | |
Store params and vals as locals in Patio
Diffstat (limited to 'src/main/java')
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) { |
