TruffleMap(Object languageContext, TruffleObject obj, Class<K> keyClass, Class<V> valueClass, Type valueType) { this.guestObject = obj; this.languageContext = languageContext; this.includeInternal = false; this.cache = TruffleMapCache.lookup(languageContext, obj.getClass(), keyClass, valueClass, valueType); }
static TruffleMapCache lookup(Object languageContext, Class<?> receiverClass, Class<?> keyClass, Class<?> valueClass, Type valueType) { EngineSupport engine = JavaInterop.ACCESSOR.engine(); if (engine == null) { return new TruffleMapCache(receiverClass, keyClass, valueClass, valueType); } Key cacheKey = new Key(receiverClass, keyClass, valueType); TruffleMapCache cache = engine.lookupJavaInteropCodeCache(languageContext, cacheKey, TruffleMapCache.class); if (cache == null) { cache = engine.installJavaInteropCodeCache(languageContext, cacheKey, new TruffleMapCache(receiverClass, keyClass, valueClass, valueType), TruffleMapCache.class); } assert cache.receiverClass == receiverClass; assert cache.keyClass == keyClass; assert cache.valueClass == valueClass; assert cache.valueType == valueType; return cache; }
TruffleMapCache(Class<?> receiverClass, Class<?> keyClass, Class<?> valueClass, Type valueType) { this.receiverClass = receiverClass; this.keyClass = keyClass; this.valueClass = valueClass; this.valueType = valueType; this.memberKey = keyClass == Object.class || keyClass == String.class || keyClass == CharSequence.class; this.numberKey = keyClass == Object.class || keyClass == Number.class || keyClass == Integer.class || keyClass == Long.class || keyClass == Short.class || keyClass == Byte.class; this.get = initializeCall(new Get(this)); this.containsKey = initializeCall(new ContainsKey(this)); this.entrySet = initializeCall(new EntrySet(this)); this.put = initializeCall(new Put(this)); this.remove = initializeCall(new Remove(this)); this.removeBoolean = initializeCall(new RemoveBoolean(this)); this.apply = initializeCall(new Apply(this)); }