private boolean shouldImplementFunction(TruffleObject truffleObject) { boolean executable = isExecutable(truffleObject); boolean instantiable = false; if (!executable) { instantiable = isInstantiable(truffleObject); } boolean implementsFunction = executable || instantiable; return implementsFunction; }
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); } else { if (TruffleOptions.AOT) { if (JavaInterop.isJavaFunctionInterface(targetType) && (isExecutable(tValue) || isInstantiable(tValue))) { return true; } else if (targetType.isInterface() && ForeignAccess.sendHasKeys(hasKeysNode, tValue)) { return isExecutable(tValue) || isInstantiable(tValue); } else { return false;
private Object convertToObject(TruffleObject truffleObject, Object languageContext) { Object primitiveValue = primitive.unbox(truffleObject); if (primitiveValue != null) { return primitiveValue; } else if (languageContext == null) { // for legacy support return truffleObject; } else if (primitive.hasKeys(truffleObject)) { return asJavaObject(truffleObject, Map.class, null, languageContext); } else if (primitive.hasSize(truffleObject)) { return asJavaObject(truffleObject, List.class, null, languageContext); } else if (isExecutable(truffleObject) || isInstantiable(truffleObject)) { return asJavaObject(truffleObject, Function.class, null, languageContext); } else { return JavaInterop.toHostValue(truffleObject, languageContext); } }
if (isExecutable(truffleObject) || isInstantiable(truffleObject)) { obj = TruffleFunction.create(languageContext, truffleObject, returnType.clazz, returnType.type); } else if (!TruffleOptions.AOT && ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) { if (JavaInterop.isJavaFunctionInterface(targetType) && (isExecutable(truffleObject) || isInstantiable(truffleObject))) { obj = JavaInteropReflect.asJavaFunction(targetType, truffleObject, languageContext); } else if (ForeignAccess.sendHasKeys(hasKeysNode, truffleObject)) {