diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-01-12 22:02:25 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-01-12 22:02:25 +0000 |
| commit | 63b3e45d88251ec7647bafcc428f59c1c3d8d2ad (patch) | |
| tree | b3b8147ea0588bb8b10bb2bdcf1e9ba17cc431a5 /src/main/java | |
| parent | a3aadd9903e64a7a459227e28feeee03d05560b3 (diff) | |
Add Shid declare-native-function instruction
Diffstat (limited to 'src/main/java')
4 files changed, 101 insertions, 11 deletions
diff --git a/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java b/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java index 83ec1821..76526fd0 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java @@ -73,6 +73,14 @@ public class ShidSerializer { ) ); + case ShidDeclareNativeFunction declareNativeFunction -> + treeListIndented( + treeIdentifier("declare-native-function"), + treeNamed("name", treeString(declareNativeFunction.name())), + positionalParamsToTree(declareNativeFunction.positionalParams()), + namedParamsToTree(declareNativeFunction.namedParams()) + ); + case ShidDefineEffect defineEffectInstruction -> treeList( treeIdentifier("define-effect"), @@ -87,16 +95,8 @@ public class ShidSerializer { case FUNCTION -> treeString("function"); }), treeNamed("name", treeString(defineFunctionInstruction.name())), - treeNamed("positional-params", treeList( - defineFunctionInstruction.positionalParams().stream() - .map(param -> treeString(param.name())) - .toList() - )), - treeNamed("named-params", treeList( - defineFunctionInstruction.namedParams().stream() - .map(param -> treeString(param.name())) - .toList() - )), + positionalParamsToTree(defineFunctionInstruction.positionalParams()), + namedParamsToTree(defineFunctionInstruction.namedParams()), treeNamed("free-variables", treeList( defineFunctionInstruction.freeVariables().stream() .map(freeVariable -> treeString(freeVariable.name())) @@ -322,6 +322,22 @@ public class ShidSerializer { }; } + private static Tree positionalParamsToTree(List<ShidParam> positionalParams) { + return treeNamed("positional-params", treeList( + positionalParams.stream() + .map(param -> treeString(param.name())) + .toList() + )); + } + + private static Tree namedParamsToTree(List<ShidParam> namedParams) { + return treeNamed("named-params", treeList( + namedParams.stream() + .map(param -> treeString(param.name())) + .toList() + )); + } + private static Tree userDefinedEffectToTree(UserDefinedEffect effect) { return treeString(effect.describe()); } diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java new file mode 100644 index 00000000..f74f447b --- /dev/null +++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java @@ -0,0 +1,71 @@ +package org.shedlang.compiler.shid.instructions; + +import org.pcollections.PVector; +import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.sources.Sources; +import org.shedlang.compiler.util.P; + +import java.util.List; + +/** + * Push a native function value onto the temporary value stack with the given + * declaration. + */ +public record ShidDeclareNativeFunction( + String name, + List<ShidParam> positionalParams, + List<ShidParam> namedParams, + Source source +) implements ShidInstruction { + @Override + public boolean isBlockTerminator() { + return false; + } + + public static Builder builder() { + return new Builder( + "f", + P.vector(), + P.vector() + ); + } + + public record Builder( + String name, + PVector<ShidParam> positionalParams, + PVector<ShidParam> namedParams + ) { + public ShidDeclareNativeFunction build() { + return new ShidDeclareNativeFunction( + name, + positionalParams, + namedParams, + Sources.NULL + ); + } + + public Builder withName(String name) { + return new Builder( + name, + this.positionalParams, + this.namedParams + ); + } + + public Builder addPositionalParam(String name) { + return new Builder( + this.name, + this.positionalParams.plus(new ShidParam(name, Sources.NULL)), + this.namedParams + ); + } + + public Builder addNamedParam(String name) { + return new Builder( + this.name, + this.positionalParams, + this.namedParams.plus(new ShidParam(name, Sources.NULL)) + ); + } + } +} diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java index b58defdd..963b9b80 100644 --- a/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java +++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.shid.instructions; import org.shedlang.compiler.sources.Source; public sealed interface ShidInstruction - permits ShidBlock, ShidCall, ShidDefineEffect, ShidDefineFunction, ShidDefineStruct, ShidDiscard, ShidDuplicate, ShidEffectHandlerBreak, ShidFieldLoad, ShidIf, ShidIntAdd, ShidIntEquals, ShidIntNotEqual, ShidIntSub, ShidLocalDrop, ShidLocalLoad, ShidLocalStore, ShidLoop, ShidLoopBreak, ShidLoopContinue, ShidMethodLoad, ShidMethodStore, ShidNamespaceFieldStore, ShidNamespaceImport, ShidPushBool, ShidPushInt, ShidPushString, ShidPushUnit, ShidResume, ShidReturn, ShidStringAdd, ShidSwitch, ShidTry, ShidTupleCreate, ShidTupleGet, ShidVarLoad, ShidVarStore { + permits ShidBlock, ShidCall, ShidDeclareNativeFunction, ShidDefineEffect, ShidDefineFunction, ShidDefineStruct, ShidDiscard, ShidDuplicate, ShidEffectHandlerBreak, ShidFieldLoad, ShidIf, ShidIntAdd, ShidIntEquals, ShidIntNotEqual, ShidIntSub, ShidLocalDrop, ShidLocalLoad, ShidLocalStore, ShidLoop, ShidLoopBreak, ShidLoopContinue, ShidMethodLoad, ShidMethodStore, ShidNamespaceFieldStore, ShidNamespaceImport, ShidPushBool, ShidPushInt, ShidPushString, ShidPushUnit, ShidResume, ShidReturn, ShidStringAdd, ShidSwitch, ShidTry, ShidTupleCreate, ShidTupleGet, ShidVarLoad, ShidVarStore { /** * If an instruction is a terminator, execution is guaranteed to leave the diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java index beb8118a..11fcdee8 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java @@ -595,6 +595,9 @@ public class ShidToPatio { yield context; } + case ShidDeclareNativeFunction declareNativeFunction -> + throw new UnsupportedOperationException("TODO"); + case ShidPushBool pushBool -> pushValue(pushBool.value() ? 1 : 0, pushBool.source(), context); |
