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)); }
@Override protected Object executeImpl(Object languageContext, TruffleObject receiver, Object[] args, int offset) { Object key = args[offset]; Object result = null; if (isValidKey(receiver, key) && KeyInfo.isReadable(sendKeyInfo(keyInfo, receiver, key))) { try { result = toHost.execute(sendRead(read, receiver, key), cache.valueClass, cache.valueType, languageContext); } catch (ClassCastException | NullPointerException e) { // expected exceptions from casting to the host value. throw e; } catch (UnknownIdentifierException e) { return null; } catch (UnsupportedMessageException e) { // be robust for misbehaving languages return null; } } return result; }