package mumbler.truffle;
import static mumbler.truffle.node.builtin.BuiltinNode.createBuiltinFunction;
import mumbler.truffle.node.builtin.arithmetic.AddBuiltinNodeFactory;
import mumbler.truffle.node.builtin.arithmetic.DivBuiltinNodeFactory;
import mumbler.truffle.node.builtin.arithmetic.ModBuiltinNodeFactory;
import mumbler.truffle.node.builtin.arithmetic.MulBuiltinNodeFactory;
import mumbler.truffle.node.builtin.arithmetic.SubBuiltinNodeFactory;
import mumbler.truffle.node.builtin.io.NowBuiltinNodeFactory;
import mumbler.truffle.node.builtin.io.PrintlnBuiltinNodeFactory;
import mumbler.truffle.node.builtin.io.SleepBuiltinNodeFactory;
import mumbler.truffle.node.builtin.lang.ReadBuiltinNodeFactory;
import mumbler.truffle.node.builtin.list.CarBuiltinNodeFactory;
import mumbler.truffle.node.builtin.list.CdrBuiltinNodeFactory;
import mumbler.truffle.node.builtin.list.ConsBuiltinNodeFactory;
import mumbler.truffle.node.builtin.list.ListBuiltinNodeFactory;
import mumbler.truffle.node.builtin.relational.EqualBuiltinNodeFactory;
import mumbler.truffle.node.builtin.relational.GreaterThanBuiltinNodeFactory;
import mumbler.truffle.node.builtin.relational.LessThanBuiltinNodeFactory;
import mumbler.truffle.parser.Namespace;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
public class MumblerContext {
private final FrameDescriptor globalFrameDescriptor;
private final Namespace globalNamespace;
private final MaterializedFrame globalFrame;
public MumblerContext() {
this.globalFrameDescriptor = new FrameDescriptor();
this.globalNamespace = new Namespace(this.globalFrameDescriptor);
this.globalFrame = this.initGlobalFrame();
}
private MaterializedFrame initGlobalFrame() {
VirtualFrame frame = Truffle.getRuntime().createVirtualFrame(null,
this.globalFrameDescriptor);
addGlobalFunctions(frame);
return frame.materialize();
}
private static void addGlobalFunctions(VirtualFrame virtualFrame) {
FrameDescriptor frameDescriptor = virtualFrame.getFrameDescriptor();
virtualFrame.setObject(frameDescriptor.addFrameSlot("println"),
createBuiltinFunction(PrintlnBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("+"),
createBuiltinFunction(AddBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("-"),
createBuiltinFunction(SubBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("*"),
createBuiltinFunction(MulBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("/"),
createBuiltinFunction(DivBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("%"),
createBuiltinFunction(ModBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("="),
createBuiltinFunction(EqualBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("<"),
createBuiltinFunction(LessThanBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot(">"),
createBuiltinFunction(GreaterThanBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("list"),
createBuiltinFunction(ListBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("cons"),
createBuiltinFunction(ConsBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("car"),
createBuiltinFunction(CarBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("cdr"),
createBuiltinFunction(CdrBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("now"),
createBuiltinFunction(NowBuiltinNodeFactory.getInstance(),
virtualFrame));
// virtualFrame.setObject(frameDescriptor.addFrameSlot("eval"),
// createBuiltinFunction(EvalBuiltinNodeFactory.getInstance(),
// virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("read"),
createBuiltinFunction(ReadBuiltinNodeFactory.getInstance(),
virtualFrame));
virtualFrame.setObject(frameDescriptor.addFrameSlot("sleep"),
createBuiltinFunction(SleepBuiltinNodeFactory.getInstance(),
virtualFrame));
}
/**
* @return A {@link MaterializedFrame} on the heap that contains all global
* values.
*/
public MaterializedFrame getGlobalFrame() {
return this.globalFrame;
}
public Namespace getGlobalNamespace() {
return this.globalNamespace;
}
}