static TruffleObject asTruffleViaReflection(Object obj, Object languageContext) { if (obj instanceof Proxy) { return asTruffleObjectProxy(obj, languageContext); } return JavaObject.forObject(obj, languageContext); }
@CompilerDirectives.TruffleBoundary private static TruffleObject asTruffleObjectProxy(Object obj, Object languageContext) { if (Proxy.isProxyClass(obj.getClass())) { InvocationHandler h = Proxy.getInvocationHandler(obj); if (h instanceof FunctionProxyHandler) { return ((FunctionProxyHandler) h).functionObj; } else if (h instanceof ObjectProxyHandler) { return ((ObjectProxyHandler) h).obj; } } return JavaObject.forObject(obj, languageContext); }
return JavaObject.NULL; } else if (obj.getClass().isArray()) { return JavaObject.forObject(obj, languageContext); } else if (obj instanceof TruffleList) { return ((TruffleList<?>) obj).guestObject; return ((TruffleFunction<?, ?>) obj).guestObject; } else if (TruffleOptions.AOT) { return JavaObject.forObject(obj, languageContext); } else { return JavaInteropReflect.asTruffleViaReflection(obj, languageContext);
private Object newArray(JavaObject receiver, Object[] args) { if (args.length != 1) { throw ArityException.raise(1, args.length); } if (toJava == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); toJava = insert(ToJavaNode.create()); } int length; try { length = (int) toJava.execute(args[0], int.class, null, receiver.languageContext); } catch (ClassCastException | NullPointerException e) { // conversion failed by ToJavaNode throw UnsupportedTypeException.raise(e, args); } Object array = Array.newInstance(receiver.asClass().getComponentType(), length); return JavaObject.forObject(array, receiver.languageContext); }
@TruffleBoundary public Object access(JavaObject receiver, boolean includeInternal) { if (receiver.isNull()) { throw UnsupportedMessageException.raise(Message.KEYS); } String[] fields = TruffleOptions.AOT ? new String[0] : JavaInteropReflect.findUniquePublicMemberNames(receiver.getLookupClass(), receiver.isStaticClass(), includeInternal); return JavaObject.forObject(fields, receiver.languageContext); } }