From 41a86c1314bc8b6c6f2c0aac39436d46f5efd1ca Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Fri, 13 Jun 2025 20:34:26 +0300 Subject: [PATCH] basic patterns impl (without variables), implementation for most of the nodes (except scopes, closure capture, etc.) --- .../truffle_lama/LamaContext.java | 35 ---- .../truffle_lama/LamaLanguage.java | 166 +----------------- .../truffle_lama/nodes/FunctionRootNode.java | 27 +++ .../nodes/LamaExpressionNode.java | 36 +--- .../truffle_lama/nodes/LamaRootNode.java | 5 +- .../nodes/controlflow/LamaCaseNode.java | 38 +++- .../nodes/controlflow/LamaControlNode.java | 4 - .../nodes/expression/LamaArrayNode.java | 22 ++- .../nodes/expression/LamaAssignNode.java | 23 ++- .../nodes/expression/LamaBinopNode.java | 3 - .../nodes/expression/LamaCallNode.java | 33 +++- .../nodes/expression/LamaElemNode.java | 20 ++- .../nodes/expression/LamaElemRefNode.java | 21 ++- .../nodes/expression/LamaGlobalRefNode.java | 19 ++ .../nodes/expression/LamaGlobalVarNode.java | 16 ++ .../nodes/expression/LamaIgnoreNode.java | 5 + .../nodes/expression/LamaIntrinsicNode.java | 4 - .../nodes/expression/LamaLambdaNode.java | 30 +++- .../nodes/expression/LamaLocalRefNode.java | 19 ++ .../nodes/expression/LamaLocalVarNode.java | 25 +++ .../nodes/expression/LamaRefNode.java | 4 - .../nodes/expression/LamaSeqNode.java | 19 +- .../nodes/expression/LamaSexpNode.java | 25 ++- .../nodes/expression/LamaSkipNode.java | 14 +- .../nodes/expression/LamaStringNode.java | 17 +- .../nodes/expression/LamaVarNode.java | 4 - .../nodes/pattern/LamaArrayPattern.java | 27 +++ .../nodes/pattern/LamaArrayTagPattern.java | 10 ++ .../nodes/pattern/LamaBoxedPattern.java | 12 ++ .../nodes/pattern/LamaClosureTagPattern.java | 10 ++ .../nodes/pattern/LamaConstPattern.java | 16 ++ .../nodes/pattern/LamaNamedPattern.java | 5 + .../nodes/pattern/LamaPattern.java | 5 + .../nodes/pattern/LamaSexpPattern.java | 4 + .../nodes/pattern/LamaSexpTagPattern.java | 10 ++ .../nodes/pattern/LamaStringPattern.java | 16 ++ .../nodes/pattern/LamaStringTagPattern.java | 10 ++ .../nodes/pattern/LamaUnBoxedPattern.java | 8 + .../nodes/pattern/LamaWildcardPattern.java | 8 + .../truffle_lama/runtime/LamaArray.java | 11 ++ .../truffle_lama/runtime/LamaArrayLike.java | 32 ++++ .../truffle_lama/runtime/LamaElemRef.java | 16 ++ .../runtime/LamaGlobalVarRef.java | 19 ++ .../truffle_lama/runtime/LamaLocalVarRef.java | 19 ++ .../truffle_lama/runtime/LamaObjRef.java | 5 + .../truffle_lama/runtime/LamaSExp.java | 13 -- .../truffle_lama/runtime/LamaSexp.java | 19 ++ 47 files changed, 643 insertions(+), 266 deletions(-) create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/FunctionRootNode.java delete mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaControlNode.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java delete mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIntrinsicNode.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java delete mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaRefNode.java delete mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaVarNode.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayTagPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaBoxedPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaClosureTagPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaConstPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaNamedPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpTagPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringTagPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaUnBoxedPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaWildcardPattern.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaArray.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaArrayLike.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java delete mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaSExp.java create mode 100644 src/main/java/org/programsnail/truffle_lama/runtime/LamaSexp.java diff --git a/src/main/java/org/programsnail/truffle_lama/LamaContext.java b/src/main/java/org/programsnail/truffle_lama/LamaContext.java index d55cebb..30c73c8 100644 --- a/src/main/java/org/programsnail/truffle_lama/LamaContext.java +++ b/src/main/java/org/programsnail/truffle_lama/LamaContext.java @@ -21,39 +21,4 @@ public final class LamaContext { public LamaContext() { this.globalScopeObject = new GlobalScopeObject(); } -// private final FrameDescriptor globalFrameDescriptor; -// private final Namespace globalNamespace; -// private final MaterializedFrame globalFrame; -// private final LamaLanguage language; -// -// public LamaContext() { this(null); } -// -// public LamaContext(LamaLanguage language) { -// this.globalFrameDescriptor = new FrameDescriptor(); -// this.globalNamespace = new Namespace(this.globalFrameDescriptor); -// this.globalFrame = this.initGlobalFrame(language); -// this.language = language; -// } -// -// private MaterializedFrame initGlobalFrame(LamaLanguage language) { -// VirtualFrame frame = Truffle.getRuntime().createVirtualFrame(null, this.globalFrameDescriptor); -// addGlobalFunctions(language, frame); -// return frame.materialize(); -// } -// -// private static void addGlobalFunctions(LamaLanguage language, VirtualFrame virtualFrame) { -// // TODO -// } -// -// /** -// * @return A {@link MaterializedFrame} on the heap that contains all global -// * values. -// */ -// public MaterializedFrame getGlobalFrame() { -// return this.globalFrame; -// } -// -// public Namespace getGlobalNamespace() { -// return this.globalNamespace; -// } } diff --git a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java index 8b8f667..288e4a2 100644 --- a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java +++ b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java @@ -26,26 +26,23 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @TruffleLanguage.Registration(id = LamaLanguage.ID, name = "Lama", defaultMimeType = LamaLanguage.MIME_TYPE, characterMimeTypes = LamaLanguage.MIME_TYPE, contextPolicy = TruffleLanguage.ContextPolicy.SHARED, fileTypeDetectors = LamaFileDetector.class) -//@ProvidedTags({StandardTags.CallTag.class, StandardTags.StatementTag.class, StandardTags.RootTag.class, StandardTags.RootBodyTag.class, StandardTags.ExpressionTag.class, DebuggerTags.AlwaysHalt.class, -// StandardTags.ReadVariableTag.class, StandardTags.WriteVariableTag.class}) public class LamaLanguage extends TruffleLanguage { -// public static volatile int counter; // count class instances + private static final LanguageReference REF = LanguageReference.create(LamaLanguage.class); + + public static LamaLanguage get(Node node) { + return REF.get(node); + } public static final String ID = "lama"; public static final String MIME_TYPE = "application/x-lama"; -// private static final Source BUILTIN_SOURCE = Source.newBuilder(ID, "", "LaMa builtin").build(); -// private static final LanguageReference REFERENCE = LanguageReference.create(LamaLanguage.class); -// private static final List> EXTERNAL_BUILTINS = Collections.synchronizedList(new ArrayList<>()); - -// public static final TruffleString.Encoding STRING_ENCODING = TruffleString.Encoding.UTF_16; - private final Assumption singleContext = Truffle.getRuntime().createAssumption("Single Lama context."); + @Override protected CallTarget parse(ParsingRequest request) throws Exception { var exprNode = LamaParser.parseLama(this, request.getSource()); - var rootNode = new LamaRootNode(exprNode); + var rootNode = new LamaRootNode(this, exprNode); return rootNode.getCallTarget(); } @@ -58,153 +55,4 @@ public class LamaLanguage extends TruffleLanguage { protected Object getScope(LamaContext context) { return context.globalScopeObject; } - - // -// // -// -// public LamaLanguage() { -//// counter++; -// } -// -// @Override -// protected LamaContext createContext(Env env) { -// return new LamaContext(this, env, new ArrayList<>(EXTERNAL_BUILTINS)); -// } -// -// @Override -// protected boolean patchContext(LamaContext context, Env newEnv) { -// context.patchContext(newEnv); -// return true; -// } -// -// // -// -// public RootCallTarget getOrCreateUndefinedFunction(TruffleString name) { -// RootCallTarget target = undefinedFunctions.get(name); -// if (target == null) { -// target = new LamaUndefinedFunctionRootNode(this, name).getCallTarget(); -// RootCallTarget other = undefinedFunctions.putIfAbsent(name, target); -// if (other != null) { -// target = other; -// } -// } -// return target; -// } -// -// public RootCallTarget lookupBuiltin(NodeFactory factory) { -// RootCallTarget target = builtinTargets.get(factory); -// if (target != null) { -// return target; -// } -// -// /* -// * The builtin node factory is a class that is automatically generated by the Truffle DSL. -// * The signature returned by the factory reflects the signature of the @Specialization -// * -// * methods in the builtin classes. -// */ -// int argumentCount = factory.getExecutionSignature().size(); -// LamaExpressionNode[] argumentNodes = new LamaExpressionNode[argumentCount]; -// /* -// * Builtin functions are like normal functions, i.e., the arguments are passed in as an -// * Object[] array encapsulated in SLArguments. A SLReadArgumentNode extracts a parameter -// * from this array. -// */ -// for (int i = 0; i < argumentCount; i++) { -// argumentNodes[i] = new LamaReadArgumentNode(i); -// } -// /* Instantiate the builtin node. This node performs the actual functionality. */ -// LamaBuiltinNode builtinBodyNode = factory.createNode((Object) argumentNodes); -// builtinBodyNode.addRootTag(); -// /* The name of the builtin function is specified via an annotation on the node class. */ -// TruffleString name = LamaStrings.fromJavaString(lookupNodeInfo(builtinBodyNode.getClass()).shortName()); -// builtinBodyNode.setUnavailableSourceSection(); -// -// /* Wrap the builtin in a RootNode. Truffle requires all AST to start with a RootNode. */ -// LamaRootNode rootNode = new LamaRootNode(this, new FrameDescriptor(), builtinBodyNode, BUILTIN_SOURCE.createUnavailableSection(), name); -// -// /* -// * Register the builtin function in the builtin registry. Call targets for builtins may be -// * reused across multiple contexts. -// */ -// RootCallTarget newTarget = rootNode.getCallTarget(); -// RootCallTarget oldTarget = builtinTargets.putIfAbsent(factory, newTarget); -// if (oldTarget != null) { -// return oldTarget; -// } -// return newTarget; -// } -// -// public static NodeInfo lookupNodeInfo(Class c) { -// if (c == null) { -// return null; -// } -// NodeInfo info = c.getAnnotation(NodeInfo.class); -// if (info != null) { -// return info; -// } else { -// return lookupNodeInfo(c.getSuperclass()); -// } -// } -// -// -// @Override -// protected void initializeMultipleContexts() { -// singleContext.invalidate(); -// } -// -// public boolean isSingleContext() { -// return singleContext.isValid(); -// } -// -// @Override -// protected Object getLanguageView(LamaContext context, Object value) { -// return LamaLanguageView.create(value); -// } -// -// @Override -// protected boolean isVisible(LamaContext context, Object value) { -// return !InteropLibrary.getFactory().getUncached(value).isNull(value); -// } -// -// @Override -// protected Object getScope(LamaContext context) { -// return context.getFunctionRegistry().getFunctionsObject(); -// } -// -// public Shape getRootShape() { -// return rootShape; -// } -// -// /** -// * Allocate an empty object. All new objects initially have no properties. Properties are added -// * when they are first stored, i.e., the store triggers a shape change of the object. -// */ -// public LamaObject createObject(AllocationReporter reporter) { -// reporter.onEnter(null, 0, AllocationReporter.SIZE_UNKNOWN); -// LamaObject object = new LamaObject(rootShape); -// reporter.onReturnValue(object, 0, AllocationReporter.SIZE_UNKNOWN); -// return object; -// } -// -// // -// -// public static LamaLanguage get(Node node) { -// return REFERENCE.get(node); -// } -// -// // -// -// public static void installBuiltin(NodeFactory builtin) { -// EXTERNAL_BUILTINS.add(builtin); -// } -// -// @Override -// protected void exitContext(LamaContext context, ExitMode exitMode, int exitCode) { -// /* -// * Runs shutdown hooks during explicit exit triggered by TruffleContext#closeExit(Node, int) -// * or natural exit triggered during natural context close. -// */ -// context.runShutdownHooks(); -// } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/FunctionRootNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionRootNode.java new file mode 100644 index 0000000..9dbef08 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionRootNode.java @@ -0,0 +1,27 @@ +package org.programsnail.truffle_lama.nodes; + +import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.RootNode; +import org.programsnail.truffle_lama.LamaLanguage; + +public class FunctionRootNode extends RootNode { + @SuppressWarnings("FieldMayBeFinal") + @Child + private LamaExpressionNode exprNode; + + public FunctionRootNode(LamaLanguage language, LamaExpressionNode exprNode) { + this(language, null, exprNode); + } + + public FunctionRootNode(LamaLanguage language, FrameDescriptor frameDescriptor, LamaExpressionNode exprNode) { + super(language, frameDescriptor); + + this.exprNode = exprNode; + } + + @Override + public Object execute(VirtualFrame frame) { + return this.exprNode.executeGeneric(frame); + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java index 3fcb13b..1ae30db 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java @@ -6,41 +6,23 @@ import com.oracle.truffle.api.instrumentation.*; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.NodeInfo; import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.LamaContext; +import org.programsnail.truffle_lama.LamaLanguage; @TypeSystemReference(LamaTypes.class) @NodeInfo(description = "The abstract base node for all expressions") public abstract class LamaExpressionNode extends Node { + protected final LamaLanguage currentTruffleLanguage() { + return LamaLanguage.get(this); + } + + protected final LamaContext currentLanguageContext() { + return LamaContext.get(this); + } - private boolean hasExpressionTag; - /** - * The execute method when no specialization is possible. This is the most general case, - * therefore it must be provided by all subclasses. - */ public abstract Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException; - /** - * The return value is just discarded. - */ - public void executeVoid(VirtualFrame frame) { - executeGeneric(frame); - } - - - public boolean hasTag(Class tag) { - if (tag == StandardTags.ExpressionTag.class) { - return hasExpressionTag; - } - return false; // no super tags - } - - /** - * Marks this node as being a {@link StandardTags.ExpressionTag} for instrumentation purposes. - */ - public final void addExpressionTag() { - hasExpressionTag = true; - } - /* * Execute methods for specialized types. They all follow the same pattern: they call the * generic execution method and then expect a result of their return type. Type-specialized diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/LamaRootNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/LamaRootNode.java index 2ef0b58..6da9340 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/LamaRootNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/LamaRootNode.java @@ -2,14 +2,15 @@ package org.programsnail.truffle_lama.nodes; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.RootNode; +import org.programsnail.truffle_lama.LamaLanguage; public class LamaRootNode extends RootNode { @SuppressWarnings("FieldMayBeFinal") @Child private LamaExpressionNode exprNode; - public LamaRootNode(LamaExpressionNode exprNode) { - super(null); + public LamaRootNode(LamaLanguage language, LamaExpressionNode exprNode) { + super(language); this.exprNode = exprNode; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java index 9d7250d..3245cde 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java @@ -1,4 +1,40 @@ package org.programsnail.truffle_lama.nodes.controlflow; -public class LamaCaseNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.nodes.pattern.LamaPattern; +import org.programsnail.truffle_lama.runtime.LamaException; + +public final class LamaCaseNode extends LamaExpressionNode { + // TODO + @Child + private LamaExpressionNode valueNode; + + private LamaPattern[] patterns; + + @Children + private LamaExpressionNode[] exprNodes; + + // atr ?? + // loc ?? + + public LamaCaseNode(LamaExpressionNode valueNode, LamaPattern[] patterns, LamaExpressionNode[] exprNodes) { + this.valueNode = valueNode; + this.patterns = patterns; + this.exprNodes = exprNodes; + + assert (exprNodes.length == patterns.length); // ?? + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + Object value = this.valueNode.executeGeneric(frame); + for (int i = 0; i < this.patterns.length; ++i) { + if (this.patterns[i].match(value)) { // TODO: special case for name binding ?? + return this.exprNodes[i].executeGeneric(frame); + } + } + throw new LamaException("Value do not match any cases"); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaControlNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaControlNode.java deleted file mode 100644 index f0bc727..0000000 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaControlNode.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.programsnail.truffle_lama.nodes.controlflow; - -public class LamaControlNode { -} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java index 49aebba..b38ff73 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java @@ -1,4 +1,24 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaArrayNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaArray; + +public final class LamaArrayNode extends LamaExpressionNode { + @Children + private LamaExpressionNode[] elementNodes; + + public LamaArrayNode(LamaExpressionNode[] elementNodes) { + this.elementNodes = elementNodes; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + Object[] elements = new Object[elementNodes.length]; + for (int i = 0; i < elements.length; ++i) { + elements[i] = elementNodes[i].executeGeneric(frame); + } + return new LamaArray(elements); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java index fd4f635..a6a765f 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java @@ -1,4 +1,25 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaAssignNode { +import com.oracle.truffle.api.dsl.NodeChild; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaException; +import org.programsnail.truffle_lama.runtime.LamaUnit; +import org.programsnail.truffle_lama.runtime.LamaGlobalVarRef; + +@NodeChild("leftNode") +@NodeChild("rightNode") +public abstract class LamaAssignNode extends LamaExpressionNode { + @Specialization + public Object assignValue(Object leftValue, Object rightValue) throws UnexpectedResultException { + if (leftValue instanceof LamaGlobalVarRef) { + if (!((LamaGlobalVarRef) leftValue).assign(rightValue)) { + throw new LamaException("Can't update variable by identifier '" + name + "'"); + } + } else { + throw new LamaException("Can't assign not to ref", this); + } + return LamaUnit.INSTANCE; + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java index 9f4b6fc..90a7a21 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java @@ -11,9 +11,6 @@ import org.programsnail.truffle_lama.nodes.LamaExpressionNode; @NodeChild("rightNode") @NodeField(name = "op", type = String.class) public abstract class LamaBinopNode extends LamaExpressionNode { - @Child - LamaExpressionNode leftNode, rightNode; - @Specialization(rewriteOn = IllegalStateException.class) protected long numOp(long leftValue, long rightValue) { return switch (op) { diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java index 5b08c22..4c8694d 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java @@ -1,4 +1,35 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaCallNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.FunctionDispatchNode; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; + +public final class LamaCallNode extends LamaExpressionNode { + @Child + private LamaExpressionNode functionNode; + + @Children + private LamaExpressionNode[] callArgumentNodes; + + @Child + private FunctionDispatchNode dispatchNode; + + public LamaCallNode(LamaExpressionNode targetFunction, LamaExpressionNode[] callArguments, FunctionDispatchNode dispatchNode) { + this.functionNode = targetFunction; + this.callArgumentNodes = callArguments; + this.dispatchNode = dispatchNode; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + Object targetFunction = this.functionNode.executeGeneric(frame); + + Object[] callArguments = new Object[callArgumentNodes.length]; + for (int i = 0; i < callArgumentNodes.length; ++i) { + callArguments[i] = callArgumentNodes[i].executeGeneric(frame); + } + + return this.dispatchNode.executeDispatch(targetFunction, callArguments); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemNode.java index d66c187..ad6e65e 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemNode.java @@ -1,4 +1,22 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaElemNode { +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.NodeChild; +import com.oracle.truffle.api.dsl.Specialization; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaArrayLike; +import org.programsnail.truffle_lama.runtime.LamaException; + +@NodeChild("leftNode") +@NodeChild("rightNode") +public abstract class LamaElemNode extends LamaExpressionNode { + @Specialization + public Object accessAt(LamaArrayLike array, int id) { + return array.readAt(id); + } + + @Fallback + public Object accessFailed(Object array, Object id) { + throw new LamaException("Elem: wrong types", this); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemRefNode.java index f1ea2af..7f3b2bd 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemRefNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaElemRefNode.java @@ -1,4 +1,23 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaElemRefNode { +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.NodeChild; +import com.oracle.truffle.api.dsl.Specialization; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaArrayLike; +import org.programsnail.truffle_lama.runtime.LamaElemRef; +import org.programsnail.truffle_lama.runtime.LamaException; + +@NodeChild("leftNode") +@NodeChild("rightNode") +public abstract class LamaElemRefNode extends LamaExpressionNode { + @Specialization + public Object accessAt(LamaArrayLike array, int id) { + return new LamaElemRef(array, id); + } + + @Fallback + public Object accessFailed(Object array, Object id) { + throw new LamaException("ElemRef: wrong types", this); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java new file mode 100644 index 0000000..239aa50 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java @@ -0,0 +1,19 @@ +package org.programsnail.truffle_lama.nodes.expression; + +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaGlobalVarRef; + +public final class LamaGlobalRefNode extends LamaExpressionNode { + String name; + + public LamaGlobalRefNode(String name) { + this.name = name; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + return new LamaGlobalVarRef(this.name, this.currentLanguageContext()); + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java new file mode 100644 index 0000000..3779c69 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java @@ -0,0 +1,16 @@ +package org.programsnail.truffle_lama.nodes.expression; + +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaUnit; + +public final class LamaGlobalVarNode extends LamaExpressionNode { + String name; + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + this.currentLanguageContext().globalScopeObject.newVariable(name, LamaUnit.INSTANCE, false); + return LamaUnit.INSTANCE; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java index 24d3d2f..8453bbc 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java @@ -9,8 +9,13 @@ public final class LamaIgnoreNode extends LamaExpressionNode { @Child LamaExpressionNode node; + public LamaIgnoreNode(LamaExpressionNode node) { + this.node = node; + } + @Override public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + node.executeGeneric(frame); return LamaUnit.INSTANCE; } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIntrinsicNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIntrinsicNode.java deleted file mode 100644 index c238188..0000000 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIntrinsicNode.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.programsnail.truffle_lama.nodes.expression; - -public class LamaIntrinsicNode { -} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java index e0ab19d..90251b8 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java @@ -1,4 +1,32 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaLambdaNode { +import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.FunctionObject; +import org.programsnail.truffle_lama.LamaLanguage; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; + +public final class LamaLambdaNode extends LamaExpressionNode { + @Child + private LamaExpressionNode bodyNode; + + private final String name; + private final FrameDescriptor frameDescriptor; + private final int argumentsCount; // local variables are translated to ids + // TODO: captured variables + + public LamaLambdaNode(LamaExpressionNode bodyNode, String name, FrameDescriptor frameDescriptor, int argumentsCount) { + this.bodyNode = bodyNode; + this.name = name; + this.frameDescriptor = frameDescriptor; + this.argumentsCount = argumentsCount; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + LamaLanguage language = this.currentTruffleLanguage(); + FunctionRootNode functionRootNode = new FunctionRootNode(language, this.frameDescriptor, this.bodyNode); + return new FunctionObject(functionRootNode.getCallTarget(), this.argumentsCount); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java new file mode 100644 index 0000000..6db49ed --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java @@ -0,0 +1,19 @@ +package org.programsnail.truffle_lama.nodes.expression; + +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaLocalVarRef; + +public final class LamaLocalRefNode extends LamaExpressionNode { + int id; + + public LamaLocalRefNode(int id) { + this.id = id; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + return new LamaLocalVarRef(this.id, frame); // TODO: correct frame ?? + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java new file mode 100644 index 0000000..175f0fb --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java @@ -0,0 +1,25 @@ +package org.programsnail.truffle_lama.nodes.expression; + +import com.oracle.truffle.api.frame.FrameSlotKind; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaUnit; + +public final class LamaLocalVarNode extends LamaExpressionNode { + private final int frameSlot; + + public int getFrameSlot() { + return frameSlot; + } + + public LamaLocalVarNode(int frameSlot) { + this.frameSlot = frameSlot; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + frame.getFrameDescriptor().setSlotKind(this.frameSlot, FrameSlotKind.Object); + return LamaUnit.INSTANCE; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaRefNode.java deleted file mode 100644 index be1db4b..0000000 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaRefNode.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.programsnail.truffle_lama.nodes.expression; - -public class LamaRefNode { -} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java index 8ca6cec..c1b0206 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java @@ -1,4 +1,21 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaSeqNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; + +public final class LamaSeqNode extends LamaExpressionNode { + @Child + LamaExpressionNode leftNode, rightNode; + + public LamaSeqNode(LamaExpressionNode leftNode, LamaExpressionNode rightNode) { + this.leftNode = leftNode; + this.rightNode = rightNode; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + leftNode.executeGeneric(frame); + return rightNode.executeGeneric(frame); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java index d34765b..193afa1 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java @@ -1,4 +1,27 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaSexpNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaSexp; + +public final class LamaSexpNode extends LamaExpressionNode { + private String tag; + + @Children + private LamaExpressionNode[] elementNodes; + + public LamaSexpNode(String tag, LamaExpressionNode[] elementNodes) { + this.tag = tag; + this.elementNodes = elementNodes; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + Object[] elements = new Object[elementNodes.length]; + for (int i = 0; i < elements.length; ++i) { + elements[i] = elementNodes[i].executeGeneric(frame); + } + return new LamaSexp(tag, elements); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java index 84b54bd..8582d04 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java @@ -1,4 +1,16 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaSkipNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaUnit; + +public final class LamaSkipNode extends LamaExpressionNode { + public LamaSkipNode() { + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + return LamaUnit.INSTANCE; + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java index a105695..357108a 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java @@ -1,4 +1,19 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaStringNode { +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import com.oracle.truffle.api.strings.TruffleString; +import org.programsnail.truffle_lama.nodes.LamaExpressionNode; + +public final class LamaStringNode extends LamaExpressionNode { + private final TruffleString value; + + public LamaStringNode(TruffleString value) { + this.value = value; + } + + @Override + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + return this.value; + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaVarNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaVarNode.java deleted file mode 100644 index 9955e13..0000000 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaVarNode.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.programsnail.truffle_lama.nodes.expression; - -public class LamaVarNode { -} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayPattern.java new file mode 100644 index 0000000..99c31be --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayPattern.java @@ -0,0 +1,27 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import org.programsnail.truffle_lama.runtime.LamaArray; + +public final class LamaArrayPattern extends LamaPattern { + private final LamaPattern[] elements; + + public LamaArrayPattern(LamaPattern[] elements) { + this.elements = elements; + } + + @Override + public boolean match(Object object) { + if (!(object instanceof LamaArray array)) { + return false; + } + if (elements.length != array.getLength()) { + return false; + } + for (int i = 0; i < elements.length; ++i) { + if (!elements[i].match(array.readAt(i))) { + return false; + } + } + return true; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayTagPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayTagPattern.java new file mode 100644 index 0000000..af86664 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaArrayTagPattern.java @@ -0,0 +1,10 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import org.programsnail.truffle_lama.runtime.LamaArray; + +public final class LamaArrayTagPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof LamaArray; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaBoxedPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaBoxedPattern.java new file mode 100644 index 0000000..e8852b2 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaBoxedPattern.java @@ -0,0 +1,12 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import com.oracle.truffle.api.strings.TruffleString; +import org.programsnail.truffle_lama.runtime.LamaArrayLike; +import org.programsnail.truffle_lama.runtime.LamaSexp; + +public final class LamaBoxedPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof TruffleString || object instanceof LamaArrayLike; // includes array and sexp + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaClosureTagPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaClosureTagPattern.java new file mode 100644 index 0000000..b034ae1 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaClosureTagPattern.java @@ -0,0 +1,10 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import org.programsnail.truffle_lama.FunctionObject; + +public final class LamaClosureTagPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof FunctionObject; // TODO: check + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaConstPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaConstPattern.java new file mode 100644 index 0000000..846a016 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaConstPattern.java @@ -0,0 +1,16 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import org.programsnail.truffle_lama.runtime.LamaArray; + +public final class LamaConstPattern extends LamaPattern { + private final long value; + + public LamaConstPattern(long value) { + this.value = value; + } + + @Override + public boolean match(Object object) { + return (object instanceof Integer other) && other == value; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaNamedPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaNamedPattern.java new file mode 100644 index 0000000..12f1156 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaNamedPattern.java @@ -0,0 +1,5 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +public final class LamaNamedPattern extends LamaPattern { + // TODO: return var assignment in som way +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaPattern.java new file mode 100644 index 0000000..3dff45b --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaPattern.java @@ -0,0 +1,5 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +public abstract class LamaPattern { + public abstract boolean match(Object object); +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpPattern.java new file mode 100644 index 0000000..6ca2ca5 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpPattern.java @@ -0,0 +1,4 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +public final class LamaSexpPattern extends LamaPattern { +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpTagPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpTagPattern.java new file mode 100644 index 0000000..c2c9954 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaSexpTagPattern.java @@ -0,0 +1,10 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import org.programsnail.truffle_lama.runtime.LamaSexp; + +public final class LamaSexpTagPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof LamaSexp; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringPattern.java new file mode 100644 index 0000000..4ec4244 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringPattern.java @@ -0,0 +1,16 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import com.oracle.truffle.api.strings.TruffleString; + +public final class LamaStringPattern extends LamaPattern { + private final TruffleString value; + + public LamaStringPattern(TruffleString value) { + this.value = value; + } + + @Override + public boolean match(Object object) { + return (object instanceof TruffleString other) && other == value; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringTagPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringTagPattern.java new file mode 100644 index 0000000..bc2947b --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaStringTagPattern.java @@ -0,0 +1,10 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +import com.oracle.truffle.api.strings.TruffleString; + +public final class LamaStringTagPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof TruffleString; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaUnBoxedPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaUnBoxedPattern.java new file mode 100644 index 0000000..2b051e5 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaUnBoxedPattern.java @@ -0,0 +1,8 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +public final class LamaUnBoxedPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return object instanceof Integer; // TODO: does work with int ?? + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaWildcardPattern.java b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaWildcardPattern.java new file mode 100644 index 0000000..0be5a26 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/nodes/pattern/LamaWildcardPattern.java @@ -0,0 +1,8 @@ +package org.programsnail.truffle_lama.nodes.pattern; + +public final class LamaWildcardPattern extends LamaPattern { + @Override + public boolean match(Object object) { + return true; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaArray.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaArray.java new file mode 100644 index 0000000..308578e --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaArray.java @@ -0,0 +1,11 @@ +package org.programsnail.truffle_lama.runtime; + +public final class LamaArray extends LamaArrayLike { + public LamaArray(Object[] elements) { + super(elements); + } + + public LamaArray(int length) { + super(length); + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaArrayLike.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaArrayLike.java new file mode 100644 index 0000000..eb25904 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaArrayLike.java @@ -0,0 +1,32 @@ +package org.programsnail.truffle_lama.runtime; + +public class LamaArrayLike { + private Object[] elements; + + public LamaArrayLike(Object[] elements) { + this.elements = elements; + } + + public LamaArrayLike(int length) { + this.elements = new Object[length]; + } + + public int getLength() { + return elements.length; + } + + public boolean assignAt(int id, Object object) { + if (id < 0 || id >= elements.length) { + return false; + } + elements[id] = object; + return true; + } + + public Object readAt(int id) { + if (id < 0 || id >= elements.length) { + return null; + } + return elements[id]; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java new file mode 100644 index 0000000..5044d2c --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java @@ -0,0 +1,16 @@ +package org.programsnail.truffle_lama.runtime; + +public class LamaElemRef extends LamaObjRef { + LamaArrayLike array; + int id; + + public LamaElemRef(LamaArrayLike array, int id) { + this.array = array; + this.id = id; + } + + @Override + public boolean assign(Object object) { + return array.assignAt(id, object); + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java new file mode 100644 index 0000000..6331b49 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java @@ -0,0 +1,19 @@ +package org.programsnail.truffle_lama.runtime; + +import org.programsnail.truffle_lama.LamaContext; + +public final class LamaGlobalVarRef extends LamaObjRef { + private String name; + private LamaContext context; + + public LamaGlobalVarRef(String name, LamaContext context) { + this.name = name; + this.context = context; + } + + @Override + public boolean assign(Object object) { + return this.context.globalScopeObject.updateVariable(name, object); + } +} + diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java new file mode 100644 index 0000000..013db9f --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java @@ -0,0 +1,19 @@ +package org.programsnail.truffle_lama.runtime; + +import com.oracle.truffle.api.frame.VirtualFrame; + +public final class LamaLocalVarRef extends LamaObjRef { + private int id; + private VirtualFrame frame; + + public LamaLocalVarRef(int id, VirtualFrame frame) { + this.id = id; + this.frame = frame; + } + + @Override + public boolean assign(Object object) { + this.frame.setObject(id, object); + return true; + } +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java new file mode 100644 index 0000000..f7da81a --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java @@ -0,0 +1,5 @@ +package org.programsnail.truffle_lama.runtime; + +public abstract class LamaObjRef { + public abstract boolean assign(Object object); +} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaSExp.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaSExp.java deleted file mode 100644 index 5e74c3d..0000000 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaSExp.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.programsnail.truffle_lama.runtime; - -import java.util.List; - -public final class LamaSExp { - public String name; - public List elements; - - LamaSExp(String name, List elements) { - this.name = name; - this.elements = elements; - } -} diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaSexp.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaSexp.java new file mode 100644 index 0000000..c169e32 --- /dev/null +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaSexp.java @@ -0,0 +1,19 @@ +package org.programsnail.truffle_lama.runtime; + +public final class LamaSexp extends LamaArrayLike { + private String tag; + + public String getTag() { + return tag; + } + + public LamaSexp(String tag, Object[] elements) { + super(elements); + this.tag = tag; + } + + LamaSexp(String tag, int length) { + super(length); + this.tag = tag; + } +}