changeset 22519:47c371370539

SL read node: update shape before going to the uncached case.
author Benoit Daloze <benoit.daloze@jku.at>
date Fri, 18 Dec 2015 16:35:25 +0100
parents 72809fce725f
children 20ce790acc30
files truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyCacheNode.java
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyCacheNode.java	Fri Dec 18 16:33:00 2015 +0100
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyCacheNode.java	Fri Dec 18 16:35:25 2015 +0100
@@ -40,6 +40,7 @@
  */
 package com.oracle.truffle.sl.nodes.access;
 
+import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
@@ -102,13 +103,23 @@
         }
     }
 
+    @Specialization(guards = "updateShape(receiver)")
+    public Object updateShapeAndRead(DynamicObject receiver) {
+        return executeObject(receiver);
+    }
+
     /*
      * The generic case is used if the number of shapes accessed overflows the limit.
      */
-    @Specialization(contains = "doCachedObject")
+    @Specialization(contains = {"doCachedObject", "updateShapeAndRead"})
     @TruffleBoundary
     protected Object doGeneric(DynamicObject receiver) {
         return receiver.get(receiver, SLNull.SINGLETON);
     }
 
+    protected static boolean updateShape(DynamicObject object) {
+        CompilerDirectives.transferToInterpreter();
+        return object.updateShape();
+    }
+
 }