package mumbler.truffle.node.special;
import mumbler.truffle.node.MumblerNode;
import mumbler.truffle.node.special.QuoteNode.QuoteKind;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeField;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
@NodeChild("literalNode")
@NodeField(name = "kind", type = QuoteKind.class)
public abstract class QuoteNode extends MumblerNode {
public static enum QuoteKind {
LONG,
BOOLEAN,
STRING,
SYMBOL,
LIST
}
protected abstract QuoteKind getKind();
@Specialization(guards = "isLongKind()")
protected long quoteLong(VirtualFrame virtualFrame, long value) {
return value;
}
@Specialization(guards = "isBooleanKind()")
protected boolean quoteBoolean(VirtualFrame virtualFrame, boolean value) {
return value;
}
@Specialization(contains = {"quoteLong", "quoteBoolean"})
protected Object quote(VirtualFrame virtualFrame, Object value) {
return value;
}
protected boolean isLongKind() {
return this.getKind() == QuoteKind.LONG;
}
protected boolean isBooleanKind() {
return this.getKind() == QuoteKind.BOOLEAN;
}
}