# HG changeset patch # User Benoit Daloze # Date 1450452925 -3600 # Node ID 47c37137053908a72014bdbefeb5876350e9cef0 # Parent 72809fce725fbabfd32a5a1b285ad4ec7617acc1 SL read node: update shape before going to the uncached case. diff -r 72809fce725f -r 47c371370539 truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/access/SLReadPropertyCacheNode.java --- 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(); + } + }