private KeyInfoCacheNode keyInfoCache() { if (keyInfoCache == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); keyInfoCache = insert(KeyInfoCacheNode.create()); } return keyInfoCache; } }
public int access(JavaObject receiver, String name) { if (receiver.isNull()) { throw UnsupportedMessageException.raise(Message.KEY_INFO); } if (TruffleOptions.AOT) { return 0; } return keyInfoCache().execute(receiver.getLookupClass(), name, receiver.isStaticClass()); }
@SuppressWarnings("unused") @Specialization(guards = {"onlyStatic == cachedStatic", "clazz == cachedClazz", "cachedName.equals(name)"}, limit = "LIMIT") static int doCached(Class<?> clazz, String name, boolean onlyStatic, @Cached("onlyStatic") boolean cachedStatic, @Cached("clazz") Class<?> cachedClazz, @Cached("name") String cachedName, @Cached("doUncached(clazz, name, onlyStatic)") int cachedKeyInfo) { assert cachedKeyInfo == doUncached(clazz, name, onlyStatic); return cachedKeyInfo; }