diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-07 19:58:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-07 20:36:45 +0100 |
| commit | ffcf99fabf00f21ee48f82c913e2ad06b3b0c395 (patch) | |
| tree | ec780a86566fd55ce57ad1f4f9cf1eeeec7e5cbe /src/main/java | |
| parent | 59b5294ffd1b5bf299f07cc0a586d67464a26cc3 (diff) | |
Return multiple values from Patio functions
Diffstat (limited to 'src/main/java')
22 files changed, 180 insertions, 200 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index 3dfae913..937e23ca 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -130,8 +130,8 @@ public class PatioToLlvm { case PatioFunctionDeclaration patioFunctionDeclaration -> { context = context.addFunctionNameToReturnType( patioFunctionDeclaration.name(), - patioTypeToLlvmType( - patioFunctionDeclaration.returnType(), + patioReturnTypesToLlvmType( + patioFunctionDeclaration.returnTypes(), globalContext.target() ) ); @@ -145,8 +145,8 @@ public class PatioToLlvm { case PatioFunctionDefinition patioFunctionDefinition -> { context = context.addFunctionNameToReturnType( patioFunctionDefinition.name(), - patioTypeToLlvmType( - patioFunctionDefinition.returnType(), + patioReturnTypesToLlvmType( + patioFunctionDefinition.returnTypes(), globalContext.target() ) ); @@ -250,8 +250,8 @@ public class PatioToLlvm { ) { return context.addTopLevelEntity(new LlvmFunctionDeclaration( patioFunctionDeclaration.name(), - patioTypeToLlvmType( - patioFunctionDeclaration.returnType(), + patioReturnTypesToLlvmType( + patioFunctionDeclaration.returnTypes(), context.target() ), patioFunctionDeclaration.params().stream() @@ -293,8 +293,8 @@ public class PatioToLlvm { return moduleContext.addTopLevelEntity(new LlvmFunctionDefinition( patioFunctionDefinition.name(), - patioTypeToLlvmType( - patioFunctionDefinition.returnType(), + patioReturnTypesToLlvmType( + patioFunctionDefinition.returnTypes(), target ), StreamSupport.stream(patioFunctionDefinition.params().spliterator(), false) @@ -616,14 +616,19 @@ public class PatioToLlvm { yield context; } - case PatioReturn patioReturn -> - context.addTerminatorInstruction(new LlvmReturn( - patioOperandToLlvmType(patioReturn.value(), context), - patioOperandToLlvmOperand(patioReturn.value(), context) - )); + case PatioReturn patioReturn -> { + var llvmReturnType = patioReturnOperandsToLlvmType(patioReturn.values(), context); - case PatioReturnVoid patioReturnVoid -> - context.addTerminatorInstruction(new LlvmReturnVoid()); + if (llvmReturnType == LlvmTypes.VOID) { + yield context.addTerminatorInstruction(new LlvmReturnVoid()); + } else { + var llvmReturnOperand = patioReturnOperandsToLlvmOperand(patioReturn.values(), context); + yield context.addTerminatorInstruction(new LlvmReturn( + llvmReturnType, + llvmReturnOperand + )); + } + } case PatioSwitch patioSwitch -> { var switchDefaultStartLabelResult = context.allocateLocalName( @@ -1069,6 +1074,17 @@ public class PatioToLlvm { ); } + private static LlvmType patioReturnOperandsToLlvmType( + List<PatioOperand> patioOperands, + PatioToLlvmFunctionContext context + ) { + var llvmTypes = patioOperands.stream() + .map(patioOperand -> patioOperandToLlvmType(patioOperand, context)) + .toList(); + + return mergeLlvmReturnTypes(llvmTypes); + } + private static LlvmType patioOperandToLlvmType( PatioOperand patioOperand, PatioToLlvmFunctionContext context @@ -1082,6 +1098,21 @@ public class PatioToLlvm { }; } + private static LlvmOperand patioReturnOperandsToLlvmOperand( + List<PatioOperand> patioReturnOperands, + PatioToLlvmFunctionContext context + ) { + if (patioReturnOperands.size() == 1) { + return patioOperandToLlvmOperand(patioReturnOperands.get(0), context); + } else { + return new LlvmOperandStructure( + patioReturnOperands.stream() + .map(patioReturnOperand -> patioOperandToLlvmTypedOperand(patioReturnOperand, context)) + .toList() + ); + } + } + private static LlvmOperand patioOperandToLlvmOperand( PatioOperand patioOperand, PatioToLlvmFunctionContext context @@ -1156,6 +1187,26 @@ public class PatioToLlvm { }; } + private static LlvmType patioReturnTypesToLlvmType( + List<PatioType> patioReturnTypes, + LlvmTarget target + ) { + var llvmReturnTypes = patioReturnTypes.stream() + .map(patioReturnType -> patioTypeToLlvmType(patioReturnType, target)) + .toList(); + return mergeLlvmReturnTypes(llvmReturnTypes); + } + + private static LlvmType mergeLlvmReturnTypes(List<LlvmType> returnTypes) { + if (returnTypes.size() == 0) { + return LlvmTypes.VOID; + } else if (returnTypes.size() == 1) { + return returnTypes.get(0); + } else { + return LlvmTypes.structure(returnTypes); + } + } + private static LlvmType patioTypeToLlvmType( PatioType patioType, LlvmTarget target @@ -1178,9 +1229,6 @@ public class PatioToLlvm { case PatioInt32Type patioInt32Type -> LlvmTypes.INT_32; - - case PatioVoidType patioVoidType -> - LlvmTypes.VOID; }; } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index ed416976..8fdcc53e 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -67,10 +67,9 @@ public class PatioToWasm { patioFunctionDeclaration.params().stream() .map(param -> patioTypeToWasmValueType(param.type(), target)) .toList(), - patioTypeToWasmResultTypes( - patioFunctionDeclaration.returnType(), - target - ) + patioFunctionDeclaration.returnTypes().stream() + .map(returnType -> patioTypeToWasmValueType(returnType, target)) + .toList() ); module = module.addImport(new WasmImport( @@ -104,10 +103,9 @@ public class PatioToWasm { } } - var wasmResultTypes = patioTypeToWasmResultTypes( - patioFunctionDefinition.returnType(), - target - ); + var wasmResultTypes = patioFunctionDefinition.returnTypes().stream() + .map(returnType -> patioTypeToWasmValueType(returnType, target)) + .toList(); var context = generateInstructions( patioFunctionDefinition.body(), @@ -341,16 +339,15 @@ public class PatioToWasm { } case PatioReturn patioReturn -> { - context = generateOperand(patioReturn.value(), context); + for (var value : patioReturn.values()) { + context = generateOperand(value, context); + } context = context.addInstruction(new WasmReturn()); yield context; } - case PatioReturnVoid patioReturnVoid -> - context.addInstruction(new WasmReturn()); - case PatioSwitch patioSwitch -> { // TODO: use br_table? @@ -793,20 +790,9 @@ public class PatioToWasm { target.patioIntType(); case PatioInt32Type patioInt32Type -> WasmValueType.I32; - case PatioVoidType patioVoidType -> - throw new IllegalArgumentException("Cannot have void values"); }; } - private static List<WasmValueType> patioTypeToWasmResultTypes( - PatioType type, - WasmTarget target - ) { - return type instanceof PatioVoidType - ? List.of() - : List.of(patioTypeToWasmValueType(type, target)); - } - private static WasmInstruction wasmIntConst(WasmValueType wasmValueType, int value) { return switch (wasmValueType) { case WasmValueType.Number number -> { diff --git a/src/main/java/org/shedlang/compiler/patio/PatioFunctionDeclaration.java b/src/main/java/org/shedlang/compiler/patio/PatioFunctionDeclaration.java index 8b9b29ae..18241108 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioFunctionDeclaration.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioFunctionDeclaration.java @@ -2,7 +2,6 @@ package org.shedlang.compiler.patio; import org.pcollections.PVector; import org.shedlang.compiler.patio.types.PatioType; -import org.shedlang.compiler.patio.types.PatioTypes; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.util.P; @@ -12,27 +11,27 @@ import java.util.List; public record PatioFunctionDeclaration( String name, List<PatioLocal> params, - PatioType returnType, + List<PatioType> returnTypes, Source source ) implements PatioCompilationUnitElement { public static Builder builder() { return new Builder( "f", P.vector(), - PatioTypes.INT + P.vector() ); } public record Builder( String name, PVector<PatioLocal> params, - PatioType returnType + PVector<PatioType> returnTypes ) { public Builder withName(String name) { return new Builder( name, this.params, - this.returnType + this.returnTypes ); } @@ -40,15 +39,15 @@ public record PatioFunctionDeclaration( return new Builder( this.name, this.params.plus(param), - this.returnType + this.returnTypes ); } - public Builder withReturnType(PatioType returnType) { + public Builder addReturnType(PatioType returnType) { return new Builder( this.name, this.params, - returnType + this.returnTypes.plus(returnType) ); } @@ -56,7 +55,7 @@ public record PatioFunctionDeclaration( return new PatioFunctionDeclaration( this.name, this.params, - this.returnType, + this.returnTypes, Sources.NULL ); } diff --git a/src/main/java/org/shedlang/compiler/patio/PatioFunctionDefinition.java b/src/main/java/org/shedlang/compiler/patio/PatioFunctionDefinition.java index 2cf0f4aa..366ac6d3 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioFunctionDefinition.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioFunctionDefinition.java @@ -3,7 +3,6 @@ package org.shedlang.compiler.patio; import org.pcollections.PVector; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.types.PatioType; -import org.shedlang.compiler.patio.types.PatioTypes; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.util.P; @@ -14,7 +13,7 @@ public record PatioFunctionDefinition( String name, PatioVisibility visibility, List<PatioLocal> locals, - PatioType returnType, + List<PatioType> returnTypes, List<PatioInstruction> body, Source source ) implements PatioCompilationUnitElement { @@ -29,7 +28,7 @@ public record PatioFunctionDefinition( "f", PatioVisibility.PRIVATE, P.vector(), - PatioTypes.INT, + P.vector(), P.vector() ); } @@ -38,7 +37,7 @@ public record PatioFunctionDefinition( String name, PatioVisibility visibility, PVector<PatioLocal> locals, - PatioType returnType, + PVector<PatioType> returnTypes, PVector<PatioInstruction> body ) { public Builder withName(String name) { @@ -46,7 +45,7 @@ public record PatioFunctionDefinition( name, this.visibility, this.locals, - this.returnType, + this.returnTypes, this.body ); } @@ -56,7 +55,7 @@ public record PatioFunctionDefinition( this.name, visibility, this.locals, - this.returnType, + this.returnTypes, this.body ); } @@ -66,7 +65,7 @@ public record PatioFunctionDefinition( this.name, this.visibility, this.locals.plus(local), - this.returnType, + this.returnTypes, this.body ); } @@ -76,17 +75,17 @@ public record PatioFunctionDefinition( this.name, this.visibility, this.locals, - this.returnType, + this.returnTypes, this.body.plus(instruction) ); } - public Builder withReturnType(PatioType returnType) { + public Builder addReturnType(PatioType returnType) { return new Builder( this.name, this.visibility, this.locals, - returnType, + this.returnTypes.plus(returnType), this.body ); } @@ -96,7 +95,7 @@ public record PatioFunctionDefinition( this.name, this.visibility, this.locals, - this.returnType, + this.returnTypes, this.body, Sources.NULL ); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index d324c5e8..5312ba7f 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -134,7 +134,11 @@ public class PatioSerializer { .map(param -> localToTree(param)) .toList() )), - treeNamed("return-type", typeToTree(functionDeclaration.returnType())) + treeNamed("return-types", treeList( + functionDeclaration.returnTypes().stream() + .map(returnType -> typeToTree(returnType)) + .toList() + )) ); case PatioFunctionDefinition functionDefinition -> @@ -147,7 +151,11 @@ public class PatioSerializer { .map(local -> localToTree(local)) .toList() )), - treeNamed("return-type", typeToTree(functionDefinition.returnType())), + treeNamed("return-types", treeList( + functionDefinition.returnTypes().stream() + .map(returnType -> typeToTree(returnType)) + .toList() + )), treeNamed("body", instructionsToTree(functionDefinition.body())) ); }; @@ -296,12 +304,7 @@ public class PatioSerializer { case PatioReturn return_ -> treeList( treeIdentifier("return"), - operandToTree(return_.value()) - ); - - case PatioReturnVoid returnVoid -> - treeList( - treeIdentifier("return-void") + operandsToTree(return_.values()) ); case PatioSwitch switch_ -> @@ -458,9 +461,6 @@ public class PatioSerializer { case PatioInt32Type int32Type -> treeIdentifier("int32"); - - case PatioVoidType voidType -> - treeIdentifier("void"); }; } diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java index 00e30fe6..25c45200 100644 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { +public sealed interface PatioInstruction permits PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { boolean isBlockTerminator(); Source source(); } diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturn.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturn.java index fcf84f51..c7cfbead 100644 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturn.java +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturn.java @@ -3,10 +3,12 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.sources.Source; +import java.util.List; + /** - * Return with the given value from the current function. + * Return with the given values from the current function. */ -public record PatioReturn(PatioOperand value, Source source) implements PatioInstruction { +public record PatioReturn(List<PatioOperand> values, Source source) implements PatioInstruction { @Override public boolean isBlockTerminator() { return true; diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturnVoid.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturnVoid.java deleted file mode 100644 index b4a8ef3e..00000000 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioReturnVoid.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.shedlang.compiler.patio.instructions; - -import org.shedlang.compiler.sources.Source; - -/** - * Return with no value from the current function. - */ -public record PatioReturnVoid(Source source) implements PatioInstruction { - @Override - public boolean isBlockTerminator() { - return true; - } -} diff --git a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java index 870c8204..1d15843b 100644 --- a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java +++ b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java @@ -364,13 +364,16 @@ public class PatioToFlatbuffers { .toArray(); var paramsVectorFbs = PatioFunctionDeclarationFbs.createParamsVector(builder, paramsOffsetsFbs); - var returnTypeFbs = serializeType(builder, functionDeclaration.returnType()); + var returnTypesOffsetsFbs = functionDeclaration.returnTypes().stream() + .mapToInt(returnType -> serializeType(builder, returnType)) + .toArray(); + var returnTypesVectorFbs = PatioFunctionDeclarationFbs.createReturnTypesVector(builder, returnTypesOffsetsFbs); PatioFunctionDeclarationFbs.startPatioFunctionDeclarationFbs(builder); PatioFunctionDeclarationFbs.addSource(builder, sourceFbs); PatioFunctionDeclarationFbs.addName(builder, nameFbs); PatioFunctionDeclarationFbs.addParams(builder, paramsVectorFbs); - PatioFunctionDeclarationFbs.addReturnType(builder, returnTypeFbs); + PatioFunctionDeclarationFbs.addReturnTypes(builder, returnTypesVectorFbs); return PatioFunctionDeclarationFbs.endPatioFunctionDeclarationFbs(builder); } @@ -389,9 +392,13 @@ public class PatioToFlatbuffers { functionDeclarationFbs.paramsLength(), PatioToFlatbuffers::deserializeLocal ); - var returnType = deserializeType(functionDeclarationFbs.returnType()); + var returnTypes = deserializeVector( + functionDeclarationFbs::returnTypes, + functionDeclarationFbs.returnTypesLength(), + PatioToFlatbuffers::deserializeType + ); - return new PatioFunctionDeclaration(name, params, returnType, source); + return new PatioFunctionDeclaration(name, params, returnTypes, source); } private static int serializeFunctionDefinition( @@ -414,7 +421,10 @@ public class PatioToFlatbuffers { .toArray(); var localsVectorFbs = PatioFunctionDefinitionFbs.createLocalsVector(builder, localsOffsetsFbs); - var returnTypeFbs = serializeType(builder, functionDefinition.returnType()); + var returnTypesOffsetsFbs = functionDefinition.returnTypes().stream() + .mapToInt(returnType -> serializeType(builder, returnType)) + .toArray(); + var returnTypesVectorFbs = PatioFunctionDefinitionFbs.createReturnTypesVector(builder, returnTypesOffsetsFbs); var bodyOffsetsFbs = functionDefinition.body().stream() .mapToInt(bodyInstruction -> serializeInstruction(builder, bodyInstruction, functionDefinition.source())) @@ -429,7 +439,7 @@ public class PatioToFlatbuffers { visibilityFbs ); PatioFunctionDefinitionFbs.addLocals(builder, localsVectorFbs); - PatioFunctionDefinitionFbs.addReturnType(builder, returnTypeFbs); + PatioFunctionDefinitionFbs.addReturnTypes(builder, returnTypesVectorFbs); PatioFunctionDefinitionFbs.addBody(builder, bodyVectorFbs); return PatioFunctionDefinitionFbs.endPatioFunctionDefinitionFbs(builder); } @@ -450,14 +460,18 @@ public class PatioToFlatbuffers { functionDefinitionFbs.localsLength(), PatioToFlatbuffers::deserializeLocal ); - var returnType = deserializeType(functionDefinitionFbs.returnType()); + var returnTypes = deserializeVector( + functionDefinitionFbs::returnTypes, + functionDefinitionFbs.returnTypesLength(), + PatioToFlatbuffers::deserializeType + ); var body = deserializeVector( functionDefinitionFbs::body, functionDefinitionFbs.bodyLength(), instructionFbs -> deserializeInstruction(instructionFbs, source) ); - return new PatioFunctionDefinition(name, visibility, locals, returnType, body, source); + return new PatioFunctionDefinition(name, visibility, locals, returnTypes, body, source); } // == Visibility == @@ -715,15 +729,6 @@ public class PatioToFlatbuffers { yield PatioInstructionFbs.endPatioInstructionFbs(builder); } - case PatioReturnVoid returnVoid -> { - var returnVoidFbs = serializeReturnVoid(builder, returnVoid, parentSource); - - PatioInstructionFbs.startPatioInstructionFbs(builder); - PatioInstructionFbs.addValueType(builder, PatioInstructionValueFbs.PatioReturnVoidFbs); - PatioInstructionFbs.addValue(builder, returnVoidFbs); - yield PatioInstructionFbs.endPatioInstructionFbs(builder); - } - case PatioSwitch switch_ -> { var switchFbs = serializeSwitch(builder, switch_, parentSource); @@ -899,12 +904,6 @@ public class PatioToFlatbuffers { parentSource ); - case PatioInstructionValueFbs.PatioReturnVoidFbs -> - deserializeReturnVoid( - (PatioReturnVoidFbs) instructionFbs.value(new PatioReturnVoidFbs()), - parentSource - ); - case PatioInstructionValueFbs.PatioSwitchFbs -> deserializeSwitch( (PatioSwitchFbs) instructionFbs.value(new PatioSwitchFbs()), @@ -1627,11 +1626,14 @@ public class PatioToFlatbuffers { parentSource ); - var valueFbs = serializeOperand(builder, instruction.value()); + var valuesOffsetsFbs = instruction.values().stream() + .mapToInt(value -> serializeOperand(builder, value)) + .toArray(); + var valuesVectorFbs = PatioReturnFbs.createValuesVector(builder, valuesOffsetsFbs); PatioReturnFbs.startPatioReturnFbs(builder); PatioReturnFbs.addSource(builder, sourceFbs); - PatioReturnFbs.addValue(builder, valueFbs); + PatioReturnFbs.addValues(builder, valuesVectorFbs); return PatioReturnFbs.endPatioReturnFbs(builder); } @@ -1644,34 +1646,13 @@ public class PatioToFlatbuffers { parentSource ); - var value = deserializeOperand(instructionFbs.value()); - - return new PatioReturn(value, source); - } - - public static int serializeReturnVoid( - FlatBufferBuilder builder, - PatioReturnVoid instruction, - Source parentSource - ) { - var sourceFbs = SourceToFlatbuffers.serializeSource( - builder, - instruction.source(), - parentSource + var values = deserializeVector( + instructionFbs::values, + instructionFbs.valuesLength(), + PatioToFlatbuffers::deserializeOperand ); - PatioReturnVoidFbs.startPatioReturnVoidFbs(builder); - PatioReturnVoidFbs.addSource(builder, sourceFbs); - return PatioReturnVoidFbs.endPatioReturnVoidFbs(builder); - } - - private static PatioReturnVoid deserializeReturnVoid( - PatioReturnVoidFbs instructionFbs, - Source parentSource - ) { - var source = SourceToFlatbuffers.deserializeSource(instructionFbs.source(), parentSource); - - return new PatioReturnVoid(source); + return new PatioReturn(values, source); } public static int serializeSwitch( @@ -2349,16 +2330,6 @@ public class PatioToFlatbuffers { PatioTypeFbs.addValue(builder, int32TypeFbs); yield PatioTypeFbs.endPatioTypeFbs(builder); } - - case PatioVoidType _ -> { - PatioVoidTypeFbs.startPatioVoidTypeFbs(builder); - var voidTypeFbs = PatioVoidTypeFbs.endPatioVoidTypeFbs(builder); - - PatioTypeFbs.startPatioTypeFbs(builder); - PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioVoidTypeFbs); - PatioTypeFbs.addValue(builder, voidTypeFbs); - yield PatioTypeFbs.endPatioTypeFbs(builder); - } }; } @@ -2382,9 +2353,6 @@ public class PatioToFlatbuffers { case PatioTypeValueFbs.PatioInt32TypeFbs -> PatioInt32Type.INSTANCE; - case PatioTypeValueFbs.PatioVoidTypeFbs -> - PatioVoidType.INSTANCE; - default -> throw new UnsupportedOperationException("TODO"); }; diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java index 53e8d0d3..357da6c3 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java @@ -40,9 +40,6 @@ public class PatioDataLayouts { case PatioInt32Type patioInt32Type -> INT32; - - case PatioVoidType patioVoidType -> - throw new UnsupportedOperationException("TODO"); }; } } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioType.java index 218672da..5ff98153 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioType.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioType.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.patio.types; -public sealed interface PatioType permits PatioBoolType, PatioByteType, PatioDataPtrType, PatioFunctionPtrType, PatioInt32Type, PatioIntType, PatioVoidType { +public sealed interface PatioType permits PatioBoolType, PatioByteType, PatioDataPtrType, PatioFunctionPtrType, PatioInt32Type, PatioIntType { } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java b/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java index 4b6279d0..184ddf4a 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java @@ -10,5 +10,4 @@ public class PatioTypes { public static final PatioFunctionPtrType FUNCTION_PTR = PatioFunctionPtrType.INSTANCE; public static final PatioIntType INT = PatioIntType.INSTANCE; public static final PatioInt32Type INT32 = PatioInt32Type.INSTANCE; - public static final PatioVoidType VOID = PatioVoidType.INSTANCE; } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioVoidType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioVoidType.java deleted file mode 100644 index 2075a03c..00000000 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioVoidType.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.shedlang.compiler.patio.types; - -public record PatioVoidType() implements PatioType { - public static final PatioVoidType INSTANCE = new PatioVoidType(); -} diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java index 3f0c752d..88d56cf6 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java @@ -44,7 +44,7 @@ public class ShidToPatio { context = context.createFunction( mainFunctionName, PatioVisibility.PRIVATE, - PatioTypes.INT, + List.of(PatioTypes.INT), source, mainContext -> { mainContext = ShidToPatioGc.init(source, mainContext); @@ -101,7 +101,7 @@ public class ShidToPatio { mainContext = ShidToPatioGc.clear(source, mainContext); mainContext = mainContext.addInstruction( - new PatioReturn(exitCode, source) + new PatioReturn(List.of(exitCode), source) ); return mainContext; @@ -779,7 +779,7 @@ public class ShidToPatio { context ); - yield context.addInstruction(new PatioReturn(value, return_.source())); + yield context.addInstruction(new PatioReturn(List.of(value), return_.source())); } case ShidStringAdd stringAdd -> diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioClosures.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioClosures.java index f93b2844..7a814649 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioClosures.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioClosures.java @@ -140,7 +140,7 @@ class ShidToPatioClosures { context = fullNameResult.context(); var bodyContextParent = context; - context = context.createFunction(fullName, PatioVisibility.PRIVATE, ShidToPatioTypes.VALUE_TYPE, source, bodyContext -> { + context = context.createFunction(fullName, PatioVisibility.PRIVATE, List.of(ShidToPatioTypes.VALUE_TYPE), source, bodyContext -> { var closurePointerResult = bodyContext.allocateParam( ShidToPatioLocalSpace.CLOSURE_POINTER, ShidToPatioClosures.CLOSURE_POINTER_TYPE @@ -201,7 +201,7 @@ class ShidToPatioClosures { generateShidParamList(positionalParams, namedParams).stream() .map(param -> PatioLocal.param(param.name(), ShidToPatioTypes.VALUE_TYPE)) .toList(), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), source )); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java index 87e5ff61..5f1025a3 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java @@ -826,7 +826,7 @@ public record ShidToPatioContext( public ShidToPatioContext createFunction( String name, PatioVisibility visibility, - PatioType returnType, + List<PatioType> returnTypes, Source source, Function<ShidToPatioContext, ShidToPatioContext> createBody ) { @@ -847,7 +847,7 @@ public record ShidToPatioContext( name, visibility, locals, - returnType, + returnTypes, bodyContext.functionContext.instructions, source )), diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioEffects.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioEffects.java index a41ef9c7..6a3a519a 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioEffects.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioEffects.java @@ -130,21 +130,21 @@ public class ShidToPatioEffects { PatioLocal.param("effectTag", EFFECT_TAG_TYPE), PatioLocal.param("methodIndex", EFFECT_METHOD_INDEX_TYPE) ), - EFFECT_HANDLER_METHOD_TYPE, + List.of(EFFECT_HANDLER_METHOD_TYPE), Sources.RUNTIME ); private static final PatioFunctionDeclaration GET_HANDLER_DECLARATION = new PatioFunctionDeclaration( "shed__runtime__effects_get_handler", List.of(), - EFFECT_HANDLER_TYPE, + List.of(EFFECT_HANDLER_TYPE), Sources.RUNTIME ); private static final PatioFunctionDeclaration SET_HANDLER_DECLARATION = new PatioFunctionDeclaration( "shed__runtime__effects_set_handler", List.of(PatioLocal.param("effectHandler", EFFECT_HANDLER_TYPE)), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -153,14 +153,14 @@ public class ShidToPatioEffects { List.of( PatioLocal.param("effectHandler", EFFECT_HANDLER_TYPE) ), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); private static final PatioFunctionDeclaration POP_HANDLER_DECLARATION = new PatioFunctionDeclaration( "shed__runtime__effects_pop_handler", List.of(), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -264,7 +264,7 @@ public class ShidToPatioEffects { bodyContext ); - bodyContext = bodyContext.addInstruction(new PatioReturn(returnValue, source)); + bodyContext = bodyContext.addInstruction(new PatioReturn(List.of(returnValue), source)); return bodyContext; }, @@ -519,7 +519,7 @@ public class ShidToPatioEffects { source )); - context = context.addInstruction(new PatioReturn(value, source)); + context = context.addInstruction(new PatioReturn(List.of(value), source)); return context; } diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java index 39ff3ce5..65403036 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioGc.java @@ -64,7 +64,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration GET_GC_ROOT_STACK_INDEX = new PatioFunctionDeclaration( "shed__runtime__gc_get_root_stack_index", List.of(), - GC_ROOT_STACK_INDEX_TYPE, + List.of(GC_ROOT_STACK_INDEX_TYPE), Sources.RUNTIME ); @@ -86,7 +86,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration SET_GC_ROOT_STACK_INDEX = new PatioFunctionDeclaration( "shed__runtime__gc_set_root_stack_index", List.of(PatioLocal.param("gc_root_stack_index", GC_ROOT_STACK_INDEX_TYPE)), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -108,7 +108,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration PUSH_GC_ROOT = new PatioFunctionDeclaration( "shed__runtime__gc_push_root", List.of(PatioLocal.param("gc_root", ShidToPatioTypes.VALUE_TYPE)), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -132,7 +132,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration INIT = new PatioFunctionDeclaration( "shed__runtime__gc_init", List.of(), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -158,7 +158,7 @@ public class ShidToPatioGc { PatioLocal.param("size", PatioTypes.INT), PatioLocal.param("runtime_type_tag", PatioTypes.INT32) ), - PatioTypes.DATA_PTR, + List.of(PatioTypes.DATA_PTR), Sources.RUNTIME ); @@ -220,7 +220,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration COLLECT = new PatioFunctionDeclaration( "shed__runtime__gc_collect", List.of(), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); @@ -282,7 +282,7 @@ public class ShidToPatioGc { private static final PatioFunctionDeclaration CLEAR = new PatioFunctionDeclaration( "shed__runtime__gc_clear", List.of(), - PatioTypes.VOID, + List.of(), Sources.RUNTIME ); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioInts.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioInts.java index 7d9e97c8..5a73eb2e 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioInts.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioInts.java @@ -21,7 +21,7 @@ public class ShidToPatioInts { List.of( PatioLocal.param("value", PatioTypes.INT) ), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); @@ -31,7 +31,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); @@ -41,7 +41,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); @@ -51,7 +51,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); @@ -61,7 +61,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); @@ -71,7 +71,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); @@ -81,7 +81,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); @@ -91,7 +91,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); @@ -101,7 +101,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); @@ -111,7 +111,7 @@ public class ShidToPatioInts { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - PatioTypes.BOOL, + List.of(PatioTypes.BOOL), Sources.RUNTIME ); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java index 0ceafc56..e32a760b 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java @@ -83,7 +83,7 @@ public class ShidToPatioNamespaces { context = context.createFunction( globalNameNamespaceInit(namespaceName), PatioVisibility.PRIVATE, - PatioTypes.VOID, + List.of(), source, initContext -> { var namespaceValueResult = initContext.allocateVal( @@ -118,7 +118,7 @@ public class ShidToPatioNamespaces { source )); - initContext = initContext.addInstruction(new PatioReturnVoid(source)); + initContext = initContext.addInstruction(new PatioReturn(List.of(), source)); return initContext; } @@ -127,7 +127,7 @@ public class ShidToPatioNamespaces { context = context.createFunction( globalNameNamespaceImport(namespaceName), PatioVisibility.PUBLIC, - NAMESPACE_VALUE_TYPE, + List.of(NAMESPACE_VALUE_TYPE), source, importContext -> { var isInitedResult = importContext.allocateVal( @@ -197,7 +197,7 @@ public class ShidToPatioNamespaces { )); importContext = importContext.addInstruction(new PatioReturn( - namespaceValue, + List.of(namespaceValue), source )); @@ -217,7 +217,7 @@ public class ShidToPatioNamespaces { context = context.addCompilationUnitElement(new PatioFunctionDeclaration( globalNameNamespaceImport(namespaceName), List.of(), - NAMESPACE_VALUE_TYPE, + List.of(NAMESPACE_VALUE_TYPE), source )); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java index 1bf51582..b4b64cf2 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java @@ -27,7 +27,7 @@ public class ShidToPatioStrings { PatioLocal.param("left", ShidToPatioTypes.VALUE_TYPE), PatioLocal.param("right", ShidToPatioTypes.VALUE_TYPE) ), - ShidToPatioTypes.VALUE_TYPE, + List.of(ShidToPatioTypes.VALUE_TYPE), Sources.RUNTIME ); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStructs.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStructs.java index 4996b89b..5358a944 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStructs.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStructs.java @@ -147,7 +147,7 @@ public class ShidToPatioStructs { source )); - bodyContext = bodyContext.addInstruction(new PatioReturn(value, source)); + bodyContext = bodyContext.addInstruction(new PatioReturn(List.of(value), source)); return bodyContext; }, |
