@Override @SuppressWarnings("unchecked") public <T> T toJava(Class<T> type) { final Object object = getObject(); final Class clazz = object.getClass(); if ( type.isPrimitive() ) { if ( type == Void.TYPE ) return null; if ( object instanceof Number && type != Boolean.TYPE || object instanceof Character && type == Character.TYPE || object instanceof Boolean && type == Boolean.TYPE ) { // FIXME in more permissive call paths, like invokedynamic, this can allow // precision-loading downcasts to happen silently return (T) object; } } else if ( type.isAssignableFrom(clazz) ) { if ( Java.OBJECT_PROXY_CACHE || metaClass.getCacheProxy() ) { getRuntime().getJavaSupport().getObjectProxyCache().put(object, this); } return type.cast(object); } else if ( type.isAssignableFrom(getClass()) ) return type.cast(this); // e.g. IRubyObject.class throw getRuntime().newTypeError("failed to coerce " + clazz.getName() + " to " + type.getName()); } }
private void setAndCacheProxyObject(ThreadContext context, RubyModule clazz, JavaProxy proxy, Object object) { proxy.setObject(object); if (Java.OBJECT_PROXY_CACHE || clazz.getCacheProxy()) { context.runtime.getJavaSupport().getObjectProxyCache().put(object, proxy); } } }
@Override public Object toJava(Class type) { Object obj = getObject(); Class cls = obj.getClass(); if (type.isPrimitive()) { if (type == Void.TYPE) return null; if (obj instanceof Number && type != Boolean.TYPE || obj instanceof Character && type == Character.TYPE || obj instanceof Boolean && type == Boolean.TYPE) { // FIXME in more permissive call paths, like invokedynamic, this can allow // precision-loading downcasts to happen silently return obj; } } else if (type.isAssignableFrom(cls)) { if (Java.OBJECT_PROXY_CACHE || metaClass.getCacheProxy()) { getRuntime().getJavaSupport().getObjectProxyCache().put(obj, this); } return obj; } throw getRuntime().newTypeError("failed to coerce " + cls.getName() + " to " + type.getName()); } }
@Override public Object toJava(Class type) { Object obj = getObject(); Class cls = obj.getClass(); if (type.isPrimitive()) { if (type == Void.TYPE) return null; if (obj instanceof Number && type != Boolean.TYPE || obj instanceof Character && type == Character.TYPE || obj instanceof Boolean && type == Boolean.TYPE) { // FIXME in more permissive call paths, like invokedynamic, this can allow // precision-loading downcasts to happen silently return obj; } } else if (type.isAssignableFrom(cls)) { if (Java.OBJECT_PROXY_CACHE || metaClass.getCacheProxy()) { getRuntime().getJavaSupport().getObjectProxyCache().put(obj, this); } return obj; } throw getRuntime().newTypeError("failed to coerce " + cls.getName() + " to " + type.getName()); } }
private void setAndCacheProxyObject(ThreadContext context, RubyModule clazz, JavaProxy proxy, Object object) { proxy.setObject(object); if (Java.OBJECT_PROXY_CACHE || clazz.getCacheProxy()) { context.runtime.getJavaSupport().getObjectProxyCache().put(object, proxy); } } }
final <T> T defaultToJava(Class<T> target) { // for callers that unconditionally pass null retval type (JRUBY-4737) if (target == void.class) return null; final Object innerWrapper = dataGetStruct(); if (innerWrapper instanceof JavaObject) { // for interface impls final Object value = ((JavaObject) innerWrapper).getValue(); // ensure the object is associated with the wrapper we found it in, // so that if it comes back we don't re-wrap it if (target.isAssignableFrom(value.getClass())) { getRuntime().getJavaSupport().getObjectProxyCache().put(value, this); return (T) value; } } else if (JavaUtil.isDuckTypeConvertable(getClass(), target)) { if (!respondsTo("java_object")) { return JavaUtil.convertProcToInterface(getRuntime().getCurrentContext(), this, target); } } else if (target.isAssignableFrom(getClass())) { return (T) this; } throw getRuntime().newTypeError("cannot convert instance of " + getClass() + " to " + target); }
final <T> T defaultToJava(Class<T> target) { // for callers that unconditionally pass null retval type (JRUBY-4737) if (target == void.class) return null; final Object innerWrapper = dataGetStruct(); if (innerWrapper instanceof JavaObject) { // for interface impls final Object value = ((JavaObject) innerWrapper).getValue(); // ensure the object is associated with the wrapper we found it in, // so that if it comes back we don't re-wrap it if (target.isAssignableFrom(value.getClass())) { getRuntime().getJavaSupport().getObjectProxyCache().put(value, this); return (T) value; } } else if (JavaUtil.isDuckTypeConvertable(getClass(), target)) { if (!respondsTo("java_object")) { return JavaUtil.convertProcToInterface(getRuntime().getCurrentContext(), this, target); } } else if (target.isAssignableFrom(getClass())) { return (T) this; } throw getRuntime().newTypeError("cannot convert instance of " + getClass() + " to " + target); }
/** * Returns a new proxy instance of a type corresponding to rawJavaObject's class, * or the cached proxy if we've already seen this object. Note that primitives * and strings are <em>not</em> coerced to corresponding Ruby types; use * JavaUtil.convertJavaToUsableRubyObject to get coerced types or proxies as * appropriate. * * @param runtime the JRuby runtime * @param rawJavaObject the object to get a wrapper for * @param forceCache whether to force the use of the proxy cache * @return the new (or cached) proxy for the specified Java object * @see JavaUtil#convertJavaToUsableRubyObject */ public static IRubyObject getInstance(Ruby runtime, Object rawJavaObject, boolean forceCache) { if (rawJavaObject != null) { RubyClass proxyClass = (RubyClass) getProxyClass(runtime, rawJavaObject.getClass()); if (OBJECT_PROXY_CACHE || forceCache || proxyClass.getCacheProxy()) { return runtime.getJavaSupport().getObjectProxyCache().getOrCreate(rawJavaObject, proxyClass); } return allocateProxy(rawJavaObject, proxyClass); } return runtime.getNil(); }
private void confirmCachedProxy(String message) { final RubyClass realClass = metaClass.getRealClass(); if ( ! realClass.getCacheProxy() ) { final Ruby runtime = getRuntime(); if (Java.OBJECT_PROXY_CACHE) { runtime.getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass)); } else { runtime.getWarnings().warn(MessageFormat.format(message, realClass)); realClass.setCacheProxy(true); runtime.getJavaSupport().getObjectProxyCache().put(getObject(), this); } } }
/** * Returns a new proxy instance of a type corresponding to rawJavaObject's class, * or the cached proxy if we've already seen this object. Note that primitives * and strings are <em>not</em> coerced to corresponding Ruby types; use * JavaUtil.convertJavaToUsableRubyObject to get coerced types or proxies as * appropriate. * * @param runtime the JRuby runtime * @param rawJavaObject the object to get a wrapper for * @param forceCache whether to force the use of the proxy cache * @return the new (or cached) proxy for the specified Java object * @see JavaUtil#convertJavaToUsableRubyObject */ public static IRubyObject getInstance(Ruby runtime, Object rawJavaObject, boolean forceCache) { if (rawJavaObject != null) { RubyClass proxyClass = (RubyClass) getProxyClass(runtime, rawJavaObject.getClass()); if (OBJECT_PROXY_CACHE || forceCache || proxyClass.getCacheProxy()) { return runtime.getJavaSupport().getObjectProxyCache().getOrCreate(rawJavaObject, proxyClass); } else { return allocateProxy(rawJavaObject, proxyClass); } } return runtime.getNil(); }
/** * Returns a new proxy instance of a type corresponding to rawJavaObject's class, * or the cached proxy if we've already seen this object. Note that primitives * and strings are <em>not</em> coerced to corresponding Ruby types; use * JavaUtil.convertJavaToUsableRubyObject to get coerced types or proxies as * appropriate. * * @param runtime the JRuby runtime * @param rawJavaObject the object to get a wrapper for * @param forceCache whether to force the use of the proxy cache * @return the new (or cached) proxy for the specified Java object * @see JavaUtil#convertJavaToUsableRubyObject */ public static IRubyObject getInstance(Ruby runtime, Object rawJavaObject, boolean forceCache) { if (rawJavaObject != null) { RubyClass proxyClass = (RubyClass) getProxyClass(runtime, rawJavaObject.getClass()); if (OBJECT_PROXY_CACHE || forceCache || proxyClass.getCacheProxy()) { return runtime.getJavaSupport().getObjectProxyCache().getOrCreate(rawJavaObject, proxyClass); } else { return allocateProxy(rawJavaObject, proxyClass); } } return runtime.getNil(); }
/** * Returns a new proxy instance of a type corresponding to rawJavaObject's class, * or the cached proxy if we've already seen this object. Note that primitives * and strings are <em>not</em> coerced to corresponding Ruby types; use * JavaUtil.convertJavaToUsableRubyObject to get coerced types or proxies as * appropriate. * * @param runtime the JRuby runtime * @param rawJavaObject the object to get a wrapper for * @param forceCache whether to force the use of the proxy cache * @return the new (or cached) proxy for the specified Java object * @see JavaUtil#convertJavaToUsableRubyObject */ public static IRubyObject getInstance(Ruby runtime, Object rawJavaObject, boolean forceCache) { if (rawJavaObject != null) { RubyClass proxyClass = (RubyClass) getProxyClass(runtime, rawJavaObject.getClass()); if (OBJECT_PROXY_CACHE || forceCache || proxyClass.getCacheProxy()) { return runtime.getJavaSupport().getObjectProxyCache().getOrCreate(rawJavaObject, proxyClass); } return allocateProxy(rawJavaObject, proxyClass); } return runtime.getNil(); }
private void confirmCachedProxy(String message) { final RubyClass realClass = metaClass.getRealClass(); if ( ! realClass.getCacheProxy() ) { final Ruby runtime = getRuntime(); if (Java.OBJECT_PROXY_CACHE) { runtime.getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass)); } else { runtime.getWarnings().warn(MessageFormat.format(message, realClass)); realClass.setCacheProxy(true); runtime.getJavaSupport().getObjectProxyCache().put(getObject(), this); } } }
/** * @see IRubyObject#toJava */ public Object toJava(Class target) { // for callers that unconditionally pass null retval type (JRUBY-4737) if (target == void.class) return null; if (dataGetStruct() instanceof JavaObject) { // for interface impls JavaObject innerWrapper = (JavaObject)dataGetStruct(); // ensure the object is associated with the wrapper we found it in, // so that if it comes back we don't re-wrap it if (target.isAssignableFrom(innerWrapper.getValue().getClass())) { getRuntime().getJavaSupport().getObjectProxyCache().put(innerWrapper.getValue(), this); return innerWrapper.getValue(); } } else if (JavaUtil.isDuckTypeConvertable(getClass(), target)) { if (!respondsTo("java_object")) { return JavaUtil.convertProcToInterface(getRuntime().getCurrentContext(), this, target); } } else if (target.isAssignableFrom(getClass())) { return this; } throw getRuntime().newTypeError("cannot convert instance of " + getClass() + " to " + target); }
private void confirmCachedProxy(String message) { RubyClass realClass = metaClass.getRealClass(); if (!realClass.getCacheProxy()) { if (Java.OBJECT_PROXY_CACHE) { getRuntime().getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass)); } else { getRuntime().getWarnings().warn(MessageFormat.format(message, realClass)); realClass.setCacheProxy(true); getRuntime().getJavaSupport().getObjectProxyCache().put(getObject(), this); } } }
private void confirmCachedProxy(String message) { RubyClass realClass = metaClass.getRealClass(); if (!realClass.getCacheProxy()) { if (Java.OBJECT_PROXY_CACHE) { getRuntime().getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass)); } else { getRuntime().getWarnings().warn(MessageFormat.format(message, realClass)); realClass.setCacheProxy(true); getRuntime().getJavaSupport().getObjectProxyCache().put(getObject(), this); } } }
/** * High-level object conversion utility. */ @Deprecated public static IRubyObject ruby_to_java(final IRubyObject recv, IRubyObject object, Block unusedBlock) { if (object.respondsTo("to_java_object")) { IRubyObject result = (IRubyObject)object.dataGetStruct(); if (result == null) { result = object.callMethod(recv.getRuntime().getCurrentContext(), "to_java_object"); } if (result instanceof JavaObject) { recv.getRuntime().getJavaSupport().getObjectProxyCache().put(((JavaObject) result).getValue(), object); } return result; } return primitive_to_java(recv, object, unusedBlock); }
/** * High-level object conversion utility. */ @Deprecated public static IRubyObject ruby_to_java(final IRubyObject recv, IRubyObject object, Block unusedBlock) { if (object.respondsTo("to_java_object")) { IRubyObject result = (IRubyObject)object.dataGetStruct(); if (result == null) { result = object.callMethod(recv.getRuntime().getCurrentContext(), "to_java_object"); } if (result instanceof JavaObject) { recv.getRuntime().getJavaSupport().getObjectProxyCache().put(((JavaObject) result).getValue(), object); } return result; } return primitive_to_java(recv, object, unusedBlock); }
/** * High-level object conversion utility. */ @Deprecated public static IRubyObject ruby_to_java(final IRubyObject recv, IRubyObject object, Block unusedBlock) { if (object.respondsTo("to_java_object")) { IRubyObject result = (IRubyObject)object.dataGetStruct(); if (result == null) { result = object.callMethod(recv.getRuntime().getCurrentContext(), "to_java_object"); } if (result instanceof JavaObject) { recv.getRuntime().getJavaSupport().getObjectProxyCache().put(((JavaObject) result).getValue(), object); } return result; } return primitive_to_java(recv, object, unusedBlock); }
/** * High-level object conversion utility. */ @Deprecated public static IRubyObject ruby_to_java(final IRubyObject recv, IRubyObject object, Block unusedBlock) { if (object.respondsTo("to_java_object")) { IRubyObject result = (IRubyObject)object.dataGetStruct(); if (result == null) { result = object.callMethod(recv.getRuntime().getCurrentContext(), "to_java_object"); } if (result instanceof JavaObject) { recv.getRuntime().getJavaSupport().getObjectProxyCache().put(((JavaObject) result).getValue(), object); } return result; } return primitive_to_java(recv, object, unusedBlock); }