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 a6a765f..7a6de9e 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 @@ -2,6 +2,7 @@ package org.programsnail.truffle_lama.nodes.expression; import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.Specialization; +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; @@ -10,11 +11,22 @@ import org.programsnail.truffle_lama.runtime.LamaGlobalVarRef; @NodeChild("leftNode") @NodeChild("rightNode") -public abstract class LamaAssignNode extends LamaExpressionNode { +public final class LamaAssignNode extends LamaExpressionNode { + @Child + private LamaExpressionNode leftNode, rightNode; + + public LamaAssignNode(LamaExpressionNode leftNode, LamaExpressionNode rightNode) { + this.leftNode = leftNode; + this.rightNode = rightNode; + } + @Specialization - public Object assignValue(Object leftValue, Object rightValue) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + var leftValue = leftNode.executeGeneric(frame); + var rightValue = rightNode.executeGeneric(frame); + if (leftValue instanceof LamaGlobalVarRef) { - if (!((LamaGlobalVarRef) leftValue).assign(rightValue)) { + if (!((LamaGlobalVarRef) leftValue).assign(rightValue, frame)) { throw new LamaException("Can't update variable by identifier '" + name + "'"); } } else { diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLeaveNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLeaveNode.java index 1e67942..9fb42eb 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLeaveNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLeaveNode.java @@ -1,4 +1,5 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaLeaveNode { +public final class LamaLeaveNode { + // TODO } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaScopeNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaScopeNode.java index 82c3ddb..f4e6890 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaScopeNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaScopeNode.java @@ -1,4 +1,5 @@ package org.programsnail.truffle_lama.nodes.expression; -public class LamaScopeNode { +public final class LamaScopeNode { + // TODO } diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java index 5044d2c..49dd8a8 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaElemRef.java @@ -1,5 +1,7 @@ package org.programsnail.truffle_lama.runtime; +import com.oracle.truffle.api.frame.VirtualFrame; + public class LamaElemRef extends LamaObjRef { LamaArrayLike array; int id; @@ -10,7 +12,7 @@ public class LamaElemRef extends LamaObjRef { } @Override - public boolean assign(Object object) { + public boolean assign(Object object, VirtualFrame frame) { 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 index 6331b49..028a83a 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java @@ -1,5 +1,6 @@ package org.programsnail.truffle_lama.runtime; +import com.oracle.truffle.api.frame.VirtualFrame; import org.programsnail.truffle_lama.LamaContext; public final class LamaGlobalVarRef extends LamaObjRef { @@ -12,7 +13,7 @@ public final class LamaGlobalVarRef extends LamaObjRef { } @Override - public boolean assign(Object object) { + public boolean assign(Object object, VirtualFrame frame) { 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 index 013db9f..8f08339 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaLocalVarRef.java @@ -4,16 +4,14 @@ 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) { + public LamaLocalVarRef(int id) { this.id = id; - this.frame = frame; } @Override - public boolean assign(Object object) { - this.frame.setObject(id, object); + public boolean assign(Object object, VirtualFrame frame) { + 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 index f7da81a..1654c35 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaObjRef.java @@ -1,5 +1,7 @@ package org.programsnail.truffle_lama.runtime; +import com.oracle.truffle.api.frame.VirtualFrame; + public abstract class LamaObjRef { - public abstract boolean assign(Object object); + public abstract boolean assign(Object object, VirtualFrame frame); }