diff --git a/pom.xml b/pom.xml
index 0b167f8..95331a2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,13 +9,51 @@
1.0-SNAPSHOT
- 23
- 23
+ 21
+ 21
UTF-8
23.1.0
4.12.0
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.1.2
+
+
+ --add-exports=java.base/jdk.internal.module=truffle.tck
+
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.14.0
+
+ 21
+ 21
+
+
+ org.graalvm.truffle
+ truffle-dsl-processor
+ ${graalvm.version}
+
+
+
+ parser/**
+
+
+
+
+
+ truffle-lama-from-scratch
+
+
org.graalvm.polyglot
diff --git a/src/main/java/org/programsnail/truffle_lama/FunctionObject.java b/src/main/java/org/programsnail/truffle_lama/FunctionObject.java
index 65e31d7..6e5a2ee 100644
--- a/src/main/java/org/programsnail/truffle_lama/FunctionObject.java
+++ b/src/main/java/org/programsnail/truffle_lama/FunctionObject.java
@@ -6,6 +6,7 @@ import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.library.ExportLibrary;
import com.oracle.truffle.api.library.ExportMessage;
import org.programsnail.truffle_lama.nodes.FunctionDispatchNode;
+import org.programsnail.truffle_lama.nodes.FunctionDispatchNodeGen;
import org.programsnail.truffle_lama.runtime.LamaException;
@ExportLibrary(InteropLibrary.class)
@@ -14,10 +15,10 @@ public final class FunctionObject implements TruffleObject {
public final int argumentCount;
public final FunctionDispatchNode functionDispatchNode;
- public FunctionObject(CallTarget callTarget, int argumentCount, FunctionDispatchNode functionDispatchNode) {
+ public FunctionObject(CallTarget callTarget, int argumentCount) {
this.callTarget = callTarget;
this.argumentCount = argumentCount;
- this.functionDispatchNode = functionDispatchNode;
+ this.functionDispatchNode = FunctionDispatchNodeGen.create();
}
@ExportMessage
diff --git a/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java b/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java
index 3c343db..b499be0 100644
--- a/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java
+++ b/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java
@@ -2,6 +2,7 @@ package org.programsnail.truffle_lama;
import com.oracle.truffle.api.TruffleLanguage;
import com.oracle.truffle.api.interop.InteropLibrary;
+import com.oracle.truffle.api.interop.InvalidArrayIndexException;
import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.interop.UnknownIdentifierException;
import com.oracle.truffle.api.library.ExportLibrary;
@@ -88,11 +89,11 @@ public final class GlobalScopeObject implements TruffleObject {
}
@ExportLibrary(InteropLibrary.class)
-final class GlobalVariablesNamesObject implements TruffleObject {
+final class GlobalVariableNamesObject implements TruffleObject {
private final List names;
- GlobalVariablesNamesObject(List names) {
- this.names = names;
+ GlobalVariableNamesObject(Set names) {
+ this.names = new ArrayList<>(names);
}
@ExportMessage
diff --git a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java
index d4a6caa..d28cf70 100644
--- a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java
+++ b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java
@@ -17,7 +17,7 @@ import com.oracle.truffle.api.strings.TruffleString;
import org.programsnail.truffle_lama.builtins.LamaBuiltinNode;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
import org.programsnail.truffle_lama.nodes.LamaRootNode;
-import org.programsnail.truffle_lama.parser.LamaParser;
+//import org.programsnail.truffle_lama.parser.LamaParser;
import java.util.ArrayList;
import java.util.Collections;
@@ -42,9 +42,11 @@ public class LamaLanguage extends TruffleLanguage {
@Override
protected CallTarget parse(ParsingRequest request) throws Exception {
- var exprNode = LamaParser.parseLama(this, request.getSource());
- var rootNode = new LamaRootNode(this, exprNode);
- return rootNode.getCallTarget();
+ // var exprNode = LamaParser.parseLama(this, request.getSource());
+ // var rootNode = new LamaRootNode(this, exprNode);
+ // return rootNode.getCallTarget();
+ // TODO
+ return null;
}
@Override
diff --git a/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java b/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java
index a312450..504d023 100644
--- a/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java
@@ -7,6 +7,7 @@ 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.LamaException;
@NodeChild(value = "arguments", type = LamaExpressionNode[].class)
@@ -32,10 +33,5 @@ public abstract class LamaBuiltinNode extends LamaExpressionNode {
return super.executeLong(frame);
}
- @Override
- public final void executeVoid(VirtualFrame frame) {
- super.executeVoid(frame);
- }
-
protected abstract Object execute(VirtualFrame frame);
}
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java
index 868286d..6933b15 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java
@@ -15,15 +15,14 @@ public abstract class FunctionDispatchNode extends Node {
@Specialization(guards = "function.callTarget == directCallNode.getCallTarget()", limit = "2")
protected static Object dispatchDirectly(FunctionObject function,
Object[] arguments,
- @Cached("create(function.callTarget)")
- DirectCallNode directCallNode) {
+ @Cached("create(function.callTarget)") DirectCallNode directCallNode) {
return directCallNode.call(arguments); // TODO: check arguments count ??
}
@Specialization(replaces = "dispatchDirectly")
protected static Object dispatchIndirectly(FunctionObject function,
Object[] arguments,
- IndirectCallNode indirectCallNode) {
+ @Cached IndirectCallNode indirectCallNode) {
return indirectCallNode.call(function.callTarget, arguments); // TODO: check arguments count ??
}
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 1ae30db..fb57137 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java
@@ -12,6 +12,11 @@ import org.programsnail.truffle_lama.LamaLanguage;
@TypeSystemReference(LamaTypes.class)
@NodeInfo(description = "The abstract base node for all expressions")
public abstract class LamaExpressionNode extends Node {
+ private static final int NO_SOURCE = -1;
+
+ private int sourceCharIndex = NO_SOURCE;
+ private int sourceLength = 0;
+
protected final LamaLanguage currentTruffleLanguage() {
return LamaLanguage.get(this);
}
@@ -21,21 +26,50 @@ public abstract class LamaExpressionNode extends Node {
}
- public abstract Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException;
+ public abstract Object executeGeneric(VirtualFrame frame);
- /*
- * 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
- * subclasses overwrite the appropriate methods.
- */
+ // ---
- // LamaTypesGen is generated from LamaTypes
+ public final void setSourceSection(int charIndex, int length) {
+ assert sourceCharIndex == NO_SOURCE : "source must only be set once";
+ if (charIndex < 0) {
+ throw new IllegalArgumentException("charIndex < 0");
+ } else if (length < 0) {
+ throw new IllegalArgumentException("length < 0");
+ }
+
+ this.sourceCharIndex = charIndex;
+ this.sourceLength = length;
+ }
+
+ // ---
+
+ public final boolean hasSource() {
+ return sourceCharIndex != NO_SOURCE;
+ }
+
+ public final int getSourceCharIndex() {
+ return sourceCharIndex;
+ }
+
+ public final int getSourceEndIndex() {
+ return sourceCharIndex + sourceLength;
+ }
+
+ public final int getSourceLength() {
+ return sourceLength;
+ }
+
+ // ---
+
+ // LamaTypesGen is generated from LamaTypes ??
// TODO
public long executeLong(VirtualFrame frame) throws UnexpectedResultException {
return LamaTypesGen.expectLong(executeGeneric(frame));
}
+ // TODO
public boolean executeBoolean(VirtualFrame frame) throws UnexpectedResultException {
return LamaTypesGen.expectBoolean(executeGeneric(frame));
}
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 bed34f8..a3affec 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
@@ -28,7 +28,7 @@ public final class LamaCaseNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
Object value = this.valueNode.executeGeneric(frame);
for (int i = 0; i < this.patterns.length; ++i) {
var patternMatch = this.patterns[i].match(value);
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java
index 554da11..76de1a3 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java
@@ -20,7 +20,7 @@ public final class LamaDoWhileNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
this.loopNode.execute(frame);
return LamaUnit.INSTANCE;
}
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java
index c1693df..968dfe4 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java
@@ -4,6 +4,7 @@ import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.profiles.ConditionProfile;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
+import org.programsnail.truffle_lama.runtime.LamaException;
import org.programsnail.truffle_lama.runtime.LamaUnit;
import java.util.Objects;
@@ -21,9 +22,13 @@ public final class LamaIfNode extends LamaExpressionNode {
private final ConditionProfile condition = ConditionProfile.create();
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
- if (this.condition.profile(this.conditionExpr.executeBoolean(frame))) {
- return this.thenExpr.executeGeneric(frame);
+ public Object executeGeneric(VirtualFrame frame) {
+ try {
+ if (this.condition.profile(this.conditionExpr.executeBoolean(frame))) {
+ return this.thenExpr.executeGeneric(frame);
+ }
+ } catch (UnexpectedResultException e) {
+ throw new LamaException("If node: condition can't be evaluated as boolean");
}
// TODO: or throw ??
return Objects.requireNonNullElse(this.elseExpr, LamaUnit.INSTANCE);
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java
index a5cbb9c..c78f94d 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java
@@ -20,7 +20,7 @@ public final class LamaWhileNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
this.loopNode.execute(frame);
return LamaUnit.INSTANCE;
}
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 b38ff73..8c0a43d 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
@@ -14,7 +14,7 @@ public final class LamaArrayNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
Object[] elements = new Object[elementNodes.length];
for (int i = 0; i < elements.length; ++i) {
elements[i] = elementNodes[i].executeGeneric(frame);
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 7a6de9e..55a0dce 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
@@ -9,8 +9,6 @@ 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 final class LamaAssignNode extends LamaExpressionNode {
@Child
private LamaExpressionNode leftNode, rightNode;
@@ -20,14 +18,13 @@ public final class LamaAssignNode extends LamaExpressionNode {
this.rightNode = rightNode;
}
- @Specialization
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
var leftValue = leftNode.executeGeneric(frame);
var rightValue = rightNode.executeGeneric(frame);
- if (leftValue instanceof LamaGlobalVarRef) {
- if (!((LamaGlobalVarRef) leftValue).assign(rightValue, frame)) {
- throw new LamaException("Can't update variable by identifier '" + name + "'");
+ if (leftValue instanceof LamaGlobalVarRef varRef) {
+ if (!varRef.assign(rightValue, frame)) {
+ throw new LamaException("Can't update variable by identifier '" + varRef.getName() + "'");
}
} else {
throw new LamaException("Can't assign not to ref", this);
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 90a7a21..e860b4f 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
@@ -1,5 +1,6 @@
package org.programsnail.truffle_lama.nodes.expression;
+import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeField;
import com.oracle.truffle.api.dsl.Specialization;
@@ -7,13 +8,15 @@ import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
-@NodeChild("leftNode")
-@NodeChild("rightNode")
+@NodeChild(value = "leftNode", type = LamaExpressionNode.class)
+@NodeChild(value = "rightNode", type = LamaExpressionNode.class)
@NodeField(name = "op", type = String.class)
public abstract class LamaBinopNode extends LamaExpressionNode {
+ protected abstract String getOp();
+
@Specialization(rewriteOn = IllegalStateException.class)
protected long numOp(long leftValue, long rightValue) {
- return switch (op) {
+ return switch (getOp()) {
case "+" -> leftValue + rightValue;
case "-" -> leftValue - rightValue;
case "/" -> leftValue / rightValue;
@@ -24,7 +27,7 @@ public abstract class LamaBinopNode extends LamaExpressionNode {
@Specialization(replaces = "numOp")
protected boolean compOp(long leftValue, long rightValue) {
- return switch (op) {
+ return switch (getOp()) {
case "<" -> leftValue < rightValue;
case "<=" -> leftValue <= rightValue;
case ">" -> leftValue > rightValue;
@@ -37,13 +40,15 @@ public abstract class LamaBinopNode extends LamaExpressionNode {
@Specialization
protected boolean boolOp(boolean leftValue, boolean rightValue) {
- return switch (op) {
+ return switch (getOp()) {
case "&&" -> leftValue && rightValue;
case "!!" -> leftValue || rightValue;
default -> throw new IllegalStateException();
};
}
- String op;
-
+ @Fallback
+ protected boolean noOp(Object leftValue, Object rightValue) {
+ throw new IllegalStateException(); // TODO
+ }
}
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 4c8694d..f123770 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
@@ -22,7 +22,7 @@ public final class LamaCallNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
Object targetFunction = this.functionNode.executeGeneric(frame);
Object[] callArguments = new Object[callArgumentNodes.length];
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java
index a78528d..5f6241f 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java
@@ -5,9 +5,9 @@ import com.oracle.truffle.api.nodes.UnexpectedResultException;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
public final class LamaConstNode extends LamaExpressionNode {
- private final int value;
+ private final long value;
- public LamaConstNode(int value) {
+ public LamaConstNode(long value) {
this.value = value;
}
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
index 239aa50..b2942fc 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java
@@ -13,7 +13,7 @@ public final class LamaGlobalRefNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
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
index 3779c69..00800f2 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java
@@ -9,7 +9,7 @@ public final class LamaGlobalVarNode extends LamaExpressionNode {
String name;
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
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 8453bbc..71b2298 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
@@ -14,7 +14,7 @@ public final class LamaIgnoreNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
node.executeGeneric(frame);
return LamaUnit.INSTANCE;
}
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 90251b8..738cbb7 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
@@ -5,6 +5,7 @@ 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.FunctionRootNode;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
public final class LamaLambdaNode extends LamaExpressionNode {
@@ -24,7 +25,7 @@ public final class LamaLambdaNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
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
index 6db49ed..bd0963d 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java
@@ -13,7 +13,7 @@ public final class LamaLocalRefNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
- return new LamaLocalVarRef(this.id, frame); // TODO: correct frame ??
+ public Object executeGeneric(VirtualFrame frame) {
+ return new LamaLocalVarRef(this.id); // 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
index 175f0fb..0898448 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java
@@ -18,7 +18,7 @@ public final class LamaLocalVarNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
frame.getFrameDescriptor().setSlotKind(this.frameSlot, FrameSlotKind.Object);
return LamaUnit.INSTANCE;
}
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 c1b0206..0c1dbca 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
@@ -14,7 +14,7 @@ public final class LamaSeqNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
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 193afa1..30e4250 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
@@ -2,22 +2,23 @@ package org.programsnail.truffle_lama.nodes.expression;
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;
import org.programsnail.truffle_lama.runtime.LamaSexp;
public final class LamaSexpNode extends LamaExpressionNode {
- private String tag;
+ private TruffleString tag;
@Children
private LamaExpressionNode[] elementNodes;
- public LamaSexpNode(String tag, LamaExpressionNode[] elementNodes) {
+ public LamaSexpNode(TruffleString tag, LamaExpressionNode[] elementNodes) {
this.tag = tag;
this.elementNodes = elementNodes;
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
Object[] elements = new Object[elementNodes.length];
for (int i = 0; i < elements.length; ++i) {
elements[i] = elementNodes[i].executeGeneric(frame);
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 8582d04..c39fa79 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
@@ -8,9 +8,9 @@ import org.programsnail.truffle_lama.runtime.LamaUnit;
public final class LamaSkipNode extends LamaExpressionNode {
public LamaSkipNode() {
}
-
+
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
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 357108a..6a90741 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
@@ -13,7 +13,7 @@ public final class LamaStringNode extends LamaExpressionNode {
}
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
return this.value;
}
}
diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java
index 18205b1..1aceb5d 100644
--- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java
+++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java
@@ -7,7 +7,7 @@ import org.programsnail.truffle_lama.runtime.LamaUnit;
public final class LamaUnitNode extends LamaExpressionNode {
@Override
- public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException {
+ public Object executeGeneric(VirtualFrame frame) {
return LamaUnit.INSTANCE;
}
}
diff --git a/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java b/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java
index 598dc57..e5b981d 100644
--- a/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java
+++ b/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java
@@ -4,9 +4,13 @@ import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.strings.TruffleString;
+import org.antlr.v4.runtime.Token;
import org.programsnail.truffle_lama.LamaLanguage;
import org.programsnail.truffle_lama.LamaStrings;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
+import org.programsnail.truffle_lama.nodes.expression.LamaConstNode;
+import org.programsnail.truffle_lama.nodes.expression.LamaSeqNode;
+import org.programsnail.truffle_lama.nodes.expression.LamaStringNode;
import org.programsnail.truffle_lama.nodes.pattern.LamaPattern;
import java.util.HashMap;
@@ -72,142 +76,163 @@ public class LamaNodeFactory {
// ---
public LamaExpressionNode defineFunction(String name, LamaExpressionNode[] args, LamaExpressionNode body) {
-
+ return null; // TODO
}
// ---
- public LamaExpressionNode createStringNode(String value) {
-
+ public LamaExpressionNode createStringNode(Token token) {
+ String text = token.getText();
+ return addSrcFromToken(new LamaStringNode(
+ LamaStrings.fromJavaString(text.substring(1, text.length() - 2))), token); // TODO: special chars
}
- public LamaExpressionNode createConstNode(long value) {
+ // TODO: use in grammar
+ public LamaExpressionNode createConstCharNode(Token token) {
+ return addSrcFromToken(new LamaConstNode(token.getText().charAt(1)), token); // TODO: special chars
+ }
+ public LamaExpressionNode createConstNode(Token token) {
+ return addSrcFromToken(new LamaConstNode(Long.parseLong(token.getText())), token);
}
public LamaExpressionNode createVarNode(String name, LamaExpressionNode value) {
-
+ return null; // TODO
}
- public LamaExpressionNode createSeqNode(LamaExpressionNode left, LamaExpressionNode ripht) {
-
+ public LamaExpressionNode createSeqNode(LamaExpressionNode left, LamaExpressionNode right) {
+ return addSrcFromNodes(new LamaSeqNode(left, right), left, right);
}
- public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode ripht) {
-
+ public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode right) {
+ // return addSrcFromNodes(new LamaBinopNo, left, right);
+ return null; // TODO
}
// TODO: decide Elem or ElemRef
public LamaExpressionNode createElemNode(LamaExpressionNode array, LamaExpressionNode index) {
-
+ return null; // TODO
}
public LamaExpressionNode createCallNode(LamaExpressionNode func, LamaExpressionNode[] args) {
-
+ return null; // TODO
}
public LamaExpressionNode createRefNode(String name) {
-
+ return null; // TODO
}
public LamaExpressionNode createClosureNode(LamaExpressionNode[] args, LamaExpressionNode body) {
-
+ return null; // TODO
}
public LamaExpressionNode createSkipNode() {
-
+ return null; // TODO
}
public LamaExpressionNode createArrayNode(LamaExpressionNode[] elems) {
-
+ return null; // TODO
}
// sexps-pairs with tag 'cons'
public LamaExpressionNode createListSexpNode(LamaExpressionNode[] elems) {
-
+ return null; // TODO
}
public LamaExpressionNode createSexpNode(String tag, LamaExpressionNode[] elems) {
-
+ return null; // TODO
}
public LamaExpressionNode createItNode(LamaExpressionNode condition, LamaExpressionNode doThen, LamaExpressionNode doElse) {
-
+ return null; // TODO
}
public LamaExpressionNode createWhileNode(LamaExpressionNode condition, LamaExpressionNode body) {
-
+ return null; // TODO
}
public LamaExpressionNode createDoWhileNode(LamaExpressionNode condition, LamaExpressionNode body) {
-
+ return null; // TODO
}
public LamaExpressionNode createCaseNode(LamaExpressionNode value, LamaPattern[] patterns, LamaExpressionNode[] exprs) {
-
+ return null; // TODO
}
// ---
public LamaPattern createWildcardPattern() {
-
+ return null; // TODO
}
public LamaPattern createSexpPattern(String name, LamaPattern[] elems) {
-
+ return null; // TODO
}
public LamaPattern createArrayPattern(LamaPattern[] elems) {
-
+ return null; // TODO
}
// sexps-pairs with tag 'cons'
public LamaPattern createListSexpPattern(LamaPattern[] elems) {
-
+ return null; // TODO
}
// TODO: fix name pattern: add possibility of associated pattern
public LamaPattern createNamedPattern(String name, LamaPattern pattern) {
-
+ return null; // TODO
}
public LamaPattern createConstPattern(long value) {
-
+ return null; // TODO
}
public LamaPattern createNegativeConstPattern(long value) {
-
+ return null; // TODO
}
public LamaPattern createStringPattern(String value) {
-
+ return null; // TODO
}
public LamaPattern createBoxedPattern() {
-
+ return null; // TODO
}
public LamaPattern createUnBoxedPattern() {
-
+ return null; // TODO
}
public LamaPattern createStringTagPattern() {
-
+ return null; // TODO
}
public LamaPattern createArrayTagPattern() {
-
+ return null; // TODO
}
public LamaPattern createSexpTagPattern() {
-
+ return null; // TODO
}
public LamaPattern createClosureTagPattern() {
-
+ return null; // TODO
}
- // ---=
+ // ---
+
+ private static LamaExpressionNode addSrcFromToken(LamaExpressionNode node, Token token) {
+ node.setSourceSection(token.getStartIndex(), token.getText().length());
+ return node;
+ }
+
+ private static LamaExpressionNode addSrcFromNodes(LamaExpressionNode node, LamaExpressionNode begin, LamaExpressionNode end) {
+ int beginIndex = begin.getSourceCharIndex();
+ node.setSourceSection(beginIndex, end.getSourceEndIndex() - beginIndex);
+ return node;
+ }
+
+ // ---
public LamaExpressionNode getRootExpr() {
// TODO
diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java
index e9c94dc..f3ef96d 100644
--- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java
+++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java
@@ -11,4 +11,9 @@ public class LamaException extends AbstractTruffleException {
public LamaException(String message, Node location) {
super(message, location);
}
+
+ public static LamaException typeError(Node node, Object... values) {
+ // TODO
+ return new LamaException("Type error");
+ }
}
diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java
index 028a83a..67786b1 100644
--- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java
+++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java
@@ -7,6 +7,10 @@ public final class LamaGlobalVarRef extends LamaObjRef {
private String name;
private LamaContext context;
+ public String getName() {
+ return this.name;
+ }
+
public LamaGlobalVarRef(String name, LamaContext context) {
this.name = name;
this.context = context;
diff --git a/src/test/java/BasicNodesTest.java b/src/test/java/BasicNodesTest.java
index c965872..7410c0b 100644
--- a/src/test/java/BasicNodesTest.java
+++ b/src/test/java/BasicNodesTest.java
@@ -7,10 +7,10 @@ import org.programsnail.truffle_lama.nodes.LamaRootNode;
public class BasicNodesTest {
@Test
public void basic_test() {
- LamaExpressionNode exprNode = null; // TODO
- var rootNode = new LamaRootNode(exprNode);
- CallTarget callTarget = rootNode.getCallTarget();
- var result = callTarget.call();
+ // LamaExpressionNode exprNode = null; // TODO
+ // var rootNode = new LamaRootNode(exprNode);
+ // CallTarget callTarget = rootNode.getCallTarget();
+ // var result = callTarget.call();
// TODO: check
}