package mumbler.truffle.node.special;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;

import mumbler.truffle.node.MumblerNode;
import mumbler.truffle.node.call.InvokeNode;

@NodeInfo(shortName = "loop", description = "Repeats the function call forever")
public class LoopNode extends MumblerNode {
    @Child private com.oracle.truffle.api.nodes.LoopNode loopNode;
    private final String callString;

    public LoopNode(InvokeNode callNode) {
        this.callString = callNode.toString();
        this.loopNode = Truffle.getRuntime().createLoopNode(
                new LoopReapeatingNode(callNode));
    }

    @Override
    public Object execute(VirtualFrame virtualFrame) {
        this.loopNode.executeLoop(virtualFrame);
        return null;
    }

    @Override
    public String toString() {
        return '\u331e' + this.callString;
    }
}