package mumbler.truffle.node; import java.util.Arrays; import mumbler.truffle.MumblerLanguage; import mumbler.truffle.node.read.ReadArgumentNode; import mumbler.truffle.node.special.DefineNodeGen; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.frame.FrameSlot; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.RootNode; public class MumblerRootNode extends RootNode { @Children private final MumblerNode[] bodyNodes; @CompilationFinal public String name; public MumblerRootNode(MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) { super(MumblerLanguage.class, null, frameDescriptor); this.bodyNodes = bodyNodes; } @Override @ExplodeLoop public Object execute(VirtualFrame virtualFrame) { int last = this.bodyNodes.length - 1; CompilerAsserts.compilationConstant(last); for (int i=0; i<last; i++) { this.bodyNodes[i].execute(virtualFrame); } return this.bodyNodes[last].execute(virtualFrame); } public static MumblerRootNode create(FrameSlot[] argumentNames, MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) { MumblerNode[] allNodes = new MumblerNode[argumentNames.length + bodyNodes.length]; for (int i=0; i<argumentNames.length; i++) { allNodes[i] = DefineNodeGen.create( new ReadArgumentNode(i), argumentNames[i]); } System.arraycopy(bodyNodes, 0, allNodes, argumentNames.length, bodyNodes.length); return new MumblerRootNode(allNodes, frameDescriptor); } public void setName(String name) { if (this.name == null) { this.name = name; } } @Override public String toString() { return Arrays.toString(this.bodyNodes); } }