var virtual frame fix, other fixes

This commit is contained in:
ProgramSnail 2025-06-14 14:09:19 +03:00
parent 1068d95010
commit da785b2faf
7 changed files with 30 additions and 13 deletions

View file

@ -2,6 +2,7 @@ package org.programsnail.truffle_lama.nodes.expression;
import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.nodes.UnexpectedResultException;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode; import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
import org.programsnail.truffle_lama.runtime.LamaException; import org.programsnail.truffle_lama.runtime.LamaException;
@ -10,11 +11,22 @@ import org.programsnail.truffle_lama.runtime.LamaGlobalVarRef;
@NodeChild("leftNode") @NodeChild("leftNode")
@NodeChild("rightNode") @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 @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 (leftValue instanceof LamaGlobalVarRef) {
if (!((LamaGlobalVarRef) leftValue).assign(rightValue)) { if (!((LamaGlobalVarRef) leftValue).assign(rightValue, frame)) {
throw new LamaException("Can't update variable by identifier '" + name + "'"); throw new LamaException("Can't update variable by identifier '" + name + "'");
} }
} else { } else {

View file

@ -1,4 +1,5 @@
package org.programsnail.truffle_lama.nodes.expression; package org.programsnail.truffle_lama.nodes.expression;
public class LamaLeaveNode { public final class LamaLeaveNode {
// TODO
} }

View file

@ -1,4 +1,5 @@
package org.programsnail.truffle_lama.nodes.expression; package org.programsnail.truffle_lama.nodes.expression;
public class LamaScopeNode { public final class LamaScopeNode {
// TODO
} }

View file

@ -1,5 +1,7 @@
package org.programsnail.truffle_lama.runtime; package org.programsnail.truffle_lama.runtime;
import com.oracle.truffle.api.frame.VirtualFrame;
public class LamaElemRef extends LamaObjRef { public class LamaElemRef extends LamaObjRef {
LamaArrayLike array; LamaArrayLike array;
int id; int id;
@ -10,7 +12,7 @@ public class LamaElemRef extends LamaObjRef {
} }
@Override @Override
public boolean assign(Object object) { public boolean assign(Object object, VirtualFrame frame) {
return array.assignAt(id, object); return array.assignAt(id, object);
} }
} }

View file

@ -1,5 +1,6 @@
package org.programsnail.truffle_lama.runtime; package org.programsnail.truffle_lama.runtime;
import com.oracle.truffle.api.frame.VirtualFrame;
import org.programsnail.truffle_lama.LamaContext; import org.programsnail.truffle_lama.LamaContext;
public final class LamaGlobalVarRef extends LamaObjRef { public final class LamaGlobalVarRef extends LamaObjRef {
@ -12,7 +13,7 @@ public final class LamaGlobalVarRef extends LamaObjRef {
} }
@Override @Override
public boolean assign(Object object) { public boolean assign(Object object, VirtualFrame frame) {
return this.context.globalScopeObject.updateVariable(name, object); return this.context.globalScopeObject.updateVariable(name, object);
} }
} }

View file

@ -4,16 +4,14 @@ import com.oracle.truffle.api.frame.VirtualFrame;
public final class LamaLocalVarRef extends LamaObjRef { public final class LamaLocalVarRef extends LamaObjRef {
private int id; private int id;
private VirtualFrame frame;
public LamaLocalVarRef(int id, VirtualFrame frame) { public LamaLocalVarRef(int id) {
this.id = id; this.id = id;
this.frame = frame;
} }
@Override @Override
public boolean assign(Object object) { public boolean assign(Object object, VirtualFrame frame) {
this.frame.setObject(id, object); frame.setObject(id, object);
return true; return true;
} }
} }

View file

@ -1,5 +1,7 @@
package org.programsnail.truffle_lama.runtime; package org.programsnail.truffle_lama.runtime;
import com.oracle.truffle.api.frame.VirtualFrame;
public abstract class LamaObjRef { public abstract class LamaObjRef {
public abstract boolean assign(Object object); public abstract boolean assign(Object object, VirtualFrame frame);
} }