package mumbler.truffle.node.builtin;

import mumbler.truffle.MumblerLanguage;
import mumbler.truffle.node.MumblerNode;
import mumbler.truffle.node.MumblerRootNode;
import mumbler.truffle.node.read.ReadArgumentNode;
import mumbler.truffle.type.MumblerFunction;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeFactory;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.VirtualFrame;

@NodeChild(value = "arguments", type = MumblerNode[].class)
public abstract class BuiltinNode extends MumblerNode {
    public static MumblerFunction createBuiltinFunction(
            MumblerLanguage lang,
            NodeFactory<? extends BuiltinNode> factory,
            VirtualFrame outerFrame) {
        int argumentCount = factory.getExecutionSignature().size();
        MumblerNode[] argumentNodes = new MumblerNode[argumentCount];
        for (int i=0; i<argumentCount; i++) {
            argumentNodes[i] = new ReadArgumentNode(i);
        }
        BuiltinNode node = factory.createNode((Object) argumentNodes);
        return new MumblerFunction(Truffle.getRuntime().createCallTarget(
                new MumblerRootNode(lang, new MumblerNode[] {node},
                        new FrameDescriptor())));
    }
}