@Override protected Object executeImpl(PolyglotLanguageContext context, Object receiver, Object[] args) { return ForeignAccess.sendHasKeys(hasKeysNode, (TruffleObject) receiver); }
boolean hasKeys(TruffleObject truffleObject) { return ForeignAccess.sendHasKeys(hasKeysNode, truffleObject); }
@Override protected Object executeImpl(Object receiver, Object[] args) { return ForeignAccess.sendHasKeys(hasKeysNode, (TruffleObject) receiver); }
boolean hasKeys(TruffleObject truffleObject) { return ForeignAccess.sendHasKeys(hasKeysNode, truffleObject); }
PolyglotLanguageBindings(Iterable<Scope> scopes) { List<TruffleObject> collectScopes = new ArrayList<>(); Node hasKeysNode = Message.HAS_KEYS.createNode(); for (Scope scope : scopes) { Object vars = scope.getVariables(); if (!(vars instanceof TruffleObject)) { throw new AssertionError("Returned scope variables object must be a TruffleObject."); } if (!ForeignAccess.sendHasKeys(hasKeysNode, (TruffleObject) vars)) { throw new AssertionError("Returned scope variables object must return true for HAS_KEYS."); } collectScopes.add((TruffleObject) vars); } this.scopes = collectScopes.toArray(new TruffleObject[0]); }
protected final boolean isValidKey(TruffleObject receiver, Object key) { if (cache.keyClass.isInstance(key)) { if (cache.memberKey && condition.profile(sendHasKeys(hasKeys, receiver))) { if (key instanceof String) { return true; } } else if (cache.numberKey && key instanceof Number && sendHasSize(hasSize, receiver)) { return true; } } return false; }
PolyglotLanguageBindings(Iterable<Scope> scopes) { List<TruffleObject> collectScopes = new ArrayList<>(); Node hasKeysNode = Message.HAS_KEYS.createNode(); for (Scope scope : scopes) { Object vars = scope.getVariables(); if (!(vars instanceof TruffleObject)) { throw new AssertionError("Returned scope variables object must be a TruffleObject."); } if (!ForeignAccess.sendHasKeys(hasKeysNode, (TruffleObject) vars)) { throw new AssertionError("Returned scope variables object must return true for HAS_KEYS."); } collectScopes.add((TruffleObject) vars); } this.scopes = collectScopes.toArray(new TruffleObject[0]); }
protected final boolean isValidKey(TruffleObject receiver, Object key) { if (cache.keyClass.isInstance(key)) { if (cache.memberKey && condition.profile(sendHasKeys(hasKeys, receiver))) { if (key instanceof String) { return true; } } else if (cache.numberKey && key instanceof Number && sendHasSize(hasSize, receiver)) { return true; } } return false; }
@Override @SuppressWarnings("unchecked") protected Object executeImpl(PolyglotLanguageContext languageContext, TruffleObject receiver, Object[] args) { List<?> keys = null; int keysSize = 0; int elemSize = 0; PolyglotMap<Object, Object> originalMap = (PolyglotMap<Object, Object>) args[ARGUMENT_OFFSET]; if (cache.memberKey && sendHasKeys(hasKeys, receiver)) { TruffleObject truffleKeys; try { truffleKeys = sendKeys(keysNode, receiver); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return Collections.emptySet(); } keys = PolyglotList.create(languageContext, truffleKeys, false, String.class, null); keysSize = keys.size(); } else if (cache.numberKey && sendHasSize(hasSize, receiver)) { try { elemSize = ((Number) sendGetSize(getSize, receiver)).intValue(); } catch (UnsupportedMessageException e) { elemSize = 0; } } return originalMap.new LazyEntries(keys, keysSize, elemSize); }
@Override @SuppressWarnings("unchecked") protected Object executeImpl(Object languageContext, TruffleObject receiver, Object[] args, int offset) { List<?> keys = null; int keysSize = 0; int elemSize = 0; TruffleMap<Object, Object> originalMap = (TruffleMap<Object, Object>) args[offset]; boolean includeInternal = (boolean) args[offset + 1]; if (cache.memberKey && sendHasKeys(hasKeys, receiver)) { TruffleObject truffleKeys; try { truffleKeys = sendKeys(keysNode, receiver, includeInternal); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); return Collections.emptySet(); } keys = TruffleList.create(languageContext, truffleKeys, false, String.class, null); keysSize = keys.size(); } else if (cache.numberKey && sendHasSize(hasSize, receiver)) { try { elemSize = ((Number) sendGetSize(getSize, receiver)).intValue(); } catch (UnsupportedMessageException e) { elemSize = 0; } } return originalMap.new LazyEntries(keys, keysSize, elemSize); }
if (obj instanceof TruffleObject) { TruffleObject tObj = (TruffleObject) obj; if (!ForeignAccess.sendHasKeys(Message.HAS_KEYS.createNode(), tObj)) { throw new AssertionError("Invalid node object: must return true for the HAS_KEYS message.");
if (obj instanceof TruffleObject) { TruffleObject tObj = (TruffleObject) obj; if (!ForeignAccess.sendHasKeys(Message.HAS_KEYS.createNode(), tObj)) { throw new AssertionError("Invalid node object: must return true for the HAS_KEYS message.");
if (priority >= FUNCTION_PROXY && HostInteropReflect.isFunctionalInterface(targetType) && (isExecutable(tValue) || isInstantiable(tValue))) { return true; } else if (priority >= OBJECT_PROXY && targetType.isInterface() && ForeignAccess.sendHasKeys(hasKeysNode, tValue)) { return true; } else {
return primitive.hasKeys(tValue); } else if (targetType == Function.class) { return isExecutable(tValue) || isInstantiable(tValue) || (TruffleOptions.AOT && ForeignAccess.sendHasKeys(hasKeysNode, tValue)); } else if (targetType.isArray()) { return primitive.hasKeys(tValue); if (JavaInterop.isJavaFunctionInterface(targetType) && (isExecutable(tValue) || isInstantiable(tValue))) { return true; } else if (targetType.isInterface() && ForeignAccess.sendHasKeys(hasKeysNode, tValue)) { return true; } else {
return ForeignAccess.sendRemove(removeMemberNode, truffleReceiver, key); } else { if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { CompilerDirectives.transferToInterpreter(); return polyglot.getMemberUnsupported(receiver, key); if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { polyglot.removeMemberUnsupported(receiver);
return ForeignAccess.sendRemove(removeMemberNode, truffleReceiver, key); } else { if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { CompilerDirectives.transferToInterpreter(); return getMemberUnsupported(context, receiver, key); if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { removeMemberUnsupported(context, receiver);
value = toHostValue.execute(ForeignAccess.sendRead(readMemberNode, truffleReceiver, key)); } else { if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { CompilerDirectives.transferToInterpreter(); return polyglot.getMemberUnsupported(receiver, key); if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { return polyglot.getMemberUnsupported(receiver, key);
value = toHostValue.execute(context, ForeignAccess.sendRead(readMemberNode, truffleReceiver, key)); } else { if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { CompilerDirectives.transferToInterpreter(); return getMemberUnsupported(context, receiver, key); if (KeyInfo.isExisting(keyInfo) || !ForeignAccess.sendHasKeys(hasKeysNode, truffleReceiver)) { return getMemberUnsupported(context, receiver, key);
if (isExecutable(truffleObject) || isInstantiable(truffleObject)) { obj = TruffleFunction.create(languageContext, truffleObject, returnType.clazz, returnType.type); } else if (!TruffleOptions.AOT && ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) { obj = JavaInteropReflect.newProxyInstance(targetType, truffleObject, languageContext); } else { if (JavaInterop.isJavaFunctionInterface(targetType) && (isExecutable(truffleObject) || isInstantiable(truffleObject))) { obj = JavaInteropReflect.asJavaFunction(targetType, truffleObject, languageContext); } else if (ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) { obj = JavaInteropReflect.newProxyInstance(targetType, truffleObject, languageContext); } else {
if (isExecutable(truffleObject) || isInstantiable(truffleObject)) { obj = PolyglotFunction.create(languageContext, truffleObject, returnType.clazz, returnType.type); } else if (ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) { obj = HostInteropReflect.newProxyInstance(targetType, truffleObject, languageContext); } else { if (HostInteropReflect.isFunctionalInterface(targetType) && (isExecutable(truffleObject) || isInstantiable(truffleObject))) { obj = HostInteropReflect.asJavaFunction(targetType, truffleObject, languageContext); } else if (ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) { obj = HostInteropReflect.newProxyInstance(targetType, truffleObject, languageContext); } else {