changeset 23362:58fa03b34d5f

specialize OSRRootNode for the specific Frame class
author Lukas Stadler <lukas.stadler@oracle.com>
date Thu, 28 Jan 2016 18:45:33 +0100
parents 1dc168caec9f
children 2a73030c41ad
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedOSRLoopNode.java
diffstat 1 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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<? extends VirtualFrame> clazz;
+
         @Child private OptimizedOSRLoopNode loopNode;
 
-        OSRRootNode(OptimizedOSRLoopNode loop) {
+        OSRRootNode(OptimizedOSRLoopNode loop, Class<? extends VirtualFrame> 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;