@Override protected boolean isObjectOfLanguage(Object object) { if (object instanceof TruffleObject) { return PolyglotProxy.isProxyGuestObject((TruffleObject) object) || JavaInterop.isJavaObject((TruffleObject) object) || VMAccessor.JAVAINTEROP.isJavaFunction(object); } else { return false; } }
@Override protected Object findMetaObject(HostContext context, Object value) { if (value instanceof TruffleObject) { TruffleObject to = (TruffleObject) value; if (JavaInterop.isJavaObject(to)) { Object javaObject = JavaInterop.asJavaObject(to); Class<?> javaType; if (javaObject == null) { javaType = Void.class; } else { javaType = javaObject.getClass(); } return javaClassToGuestObject(javaType); } else if (PolyglotProxy.isProxyGuestObject(to)) { Proxy proxy = PolyglotProxy.toProxyHostObject(to); return javaClassToGuestObject(proxy.getClass()); } else if (VMAccessor.JAVAINTEROP.isJavaFunction(value)) { return "Bound Method"; } else { return "Foreign Object"; } } else { return javaClassToGuestObject(value.getClass()); } }
private String toStringImpl(HostContext context, Object value, int level) { if (value instanceof TruffleObject) { TruffleObject to = (TruffleObject) value; if (JavaInterop.isJavaObject(to)) { Object javaObject = JavaInterop.asJavaObject(to); try {
Interop(PolyglotLanguageContext context, TruffleObject receiver, Class<?> receiverType) { super(context, receiverType); Objects.requireNonNull(receiverType); this.isNativePointer = createTarget(new IsNativePointerNode(this)); this.asNativePointer = createTarget(new AsNativePointerNode(this)); this.hasArrayElements = createTarget(new HasArrayElementsNode(this)); this.getArrayElement = createTarget(new GetArrayElementNode(this)); this.setArrayElement = createTarget(new SetArrayElementNode(this)); this.removeArrayElement = createTarget(new RemoveArrayElementNode(this)); this.getArraySize = createTarget(new GetArraySizeNode(this)); this.hasMember = createTarget(new HasMemberNode(this)); this.getMember = createTarget(new GetMemberNode(this)); this.putMember = createTarget(new PutMemberNode(this)); this.removeMember = createTarget(new RemoveMemberNode(this)); this.isNull = createTarget(new IsNullNode(this)); this.execute = createTarget(new ExecuteNode(this)); this.executeNoArgs = createTarget(new ExecuteNoArgsNode(this)); this.executeVoid = createTarget(new ExecuteVoidNode(this)); this.executeVoidNoArgs = createTarget(new ExecuteVoidNoArgsNode(this)); this.newInstance = createTarget(new NewInstanceNode(this)); this.canInstantiate = createTarget(new CanInstantiateNode(this)); this.canExecute = createTarget(new CanExecuteNode(this)); this.hasMembers = createTarget(new HasMembersNode(this)); this.asPrimitive = createTarget(new AsPrimitiveNode(this)); this.isProxy = PolyglotProxy.isProxyGuestObject(receiver); this.isJava = JavaInterop.isJavaObject(receiver); }