# HG changeset patch # User Lukas Stadler # Date 1454003133 -3600 # Node ID 58fa03b34d5f5694ba86e0ec46eaa6ee11f9b3f3 # Parent 1dc168caec9fc0129b350b6ea30ecb610889773a specialize OSRRootNode for the specific Frame class diff -r 1dc168caec9f -r 58fa03b34d5f graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedOSRLoopNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedOSRLoopNode.java Thu Jan 28 18:44:59 2016 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedOSRLoopNode.java Thu Jan 28 18:45:33 2016 +0100 @@ -168,7 +168,7 @@ return null; } else { Node parent = getParent(); - OptimizedCallTarget osrTarget = (OptimizedCallTarget) Truffle.getRuntime().createCallTarget(new OSRRootNode(this)); + OptimizedCallTarget osrTarget = (OptimizedCallTarget) Truffle.getRuntime().createCallTarget(new OSRRootNode(this, frame.getClass())); // to avoid a deopt on first call we provide some profiling information osrTarget.profileReturnType(Boolean.TRUE); osrTarget.profileReturnType(Boolean.FALSE); @@ -210,16 +210,19 @@ private static class OSRRootNode extends RootNode { + private final Class clazz; + @Child private OptimizedOSRLoopNode loopNode; - OSRRootNode(OptimizedOSRLoopNode loop) { + OSRRootNode(OptimizedOSRLoopNode loop, Class clazz) { super(TruffleLanguage.class, loop.getSourceSection(), loop.getRootNode().getFrameDescriptor()); this.loopNode = loop; + this.clazz = clazz; } @Override public Object execute(VirtualFrame frame) { - VirtualFrame parentFrame = (VirtualFrame) frame.getArguments()[0]; + VirtualFrame parentFrame = clazz.cast(frame.getArguments()[0]); while (loopNode.getRepeatingNode().executeRepeating(parentFrame)) { if (CompilerDirectives.inInterpreter()) { return Boolean.FALSE;