package mumbler.truffle.node.call;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
final public class UninitializedDispatchNode extends DispatchNode {
@Override
protected Object executeDispatch(VirtualFrame virtualFrame,
CallTarget callTarget, Object[] arguments) {
CompilerDirectives.transferToInterpreterAndInvalidate();
Node cur = this;
int size = 0;
while (cur.getParent() instanceof DispatchNode) {
cur = cur.getParent();
size++;
}
InvokeNode invokeNode = (InvokeNode) cur.getParent();
DispatchNode replacement;
if (size < INLINE_CACHE_SIZE) {
// There's still room in the cache. Add a new DirectDispatchNode.
DispatchNode next = new UninitializedDispatchNode();
replacement = new DirectDispatchNode(next, callTarget);
this.replace(replacement);
} else {
replacement = new GenericDispatchNode();
invokeNode.dispatchNode.replace(replacement);
}
// Call function with newly created dispatch node.
return replacement.executeDispatch(virtualFrame, callTarget, arguments);
}
}