package mumbler.truffle.node;
import java.math.BigInteger;
import mumbler.truffle.MumblerTypes;
import mumbler.truffle.MumblerTypesGen;
import mumbler.truffle.type.MumblerFunction;
import mumbler.truffle.type.MumblerList;
import mumbler.truffle.type.MumblerSymbol;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.dsl.TypeSystemReference;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.NodeInfo;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.source.SourceSection;
@TypeSystemReference(MumblerTypes.class)
@NodeInfo(language = "Mumbler Language", description = "The abstract base node for all expressions")
public abstract class MumblerNode extends Node {
@CompilationFinal
private SourceSection sourceSection;
@CompilationFinal
private boolean isTail = false;
@Override
public SourceSection getSourceSection() {
return this.sourceSection;
}
public void setSourceSection(SourceSection sourceSection) {
this.sourceSection = sourceSection;
}
public boolean isTail() {
return this.isTail;
}
public void setIsTail() {
this.isTail = true;
}
public abstract Object execute(VirtualFrame virtualFrame);
public long executeLong(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectLong(this.execute(virtualFrame));
}
public boolean executeBoolean(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectBoolean(this.execute(virtualFrame));
}
public BigInteger executeBigInteger(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectBigInteger(this.execute(virtualFrame));
}
public MumblerSymbol executeMumblerSymbol(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectMumblerSymbol(this.execute(virtualFrame));
}
public MumblerFunction executeMumblerFunction(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectMumblerFunction(
this.execute(virtualFrame));
}
public MumblerList<?> executeMumblerList(VirtualFrame virtualFrame)
throws UnexpectedResultException {
return MumblerTypesGen.expectMumblerList(this.execute(virtualFrame));
}
public String executeString(VirtualFrame virtualFrame)
throws UnexpectedResultException{
return MumblerTypesGen.expectString(this.execute(virtualFrame));
}
protected boolean isArgumentIndexInRange(VirtualFrame virtualFrame,
int index) {
return (index + 1) < virtualFrame.getArguments().length;
}
protected Object getArgument(VirtualFrame virtualFrame, int index) {
return virtualFrame.getArguments()[index + 1];
}
protected static MaterializedFrame getLexicalScope(Frame frame) {
Object[] args = frame.getArguments();
if (args.length > 0) {
return (MaterializedFrame) frame.getArguments()[0];
} else {
return null;
}
}
}