Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.java.proxies;
  
  import org.jruby.Ruby;
 
 public class ConcreteJavaProxy extends JavaProxy {
     public ConcreteJavaProxy(Ruby runtimeRubyClass klazz) {
         super(runtimeklazz);
     }
     
     public ConcreteJavaProxy(Ruby runtimeRubyClass klazzObject object) {
         super(runtimeklazzobject);
     }
     
     public static RubyClass createConcreteJavaProxy(ThreadContext context) {
         Ruby runtime = context.runtime;
         
         RubyClass concreteJavaProxy = runtime.defineClass("ConcreteJavaProxy",
                 runtime.getJavaSupport().getJavaProxyClass(),
                 new ObjectAllocator() {
             public IRubyObject allocate(Ruby runtimeRubyClass klazz) {
                 return new ConcreteJavaProxy(runtimeklazz);
             }
         });
         initialize(concreteJavaProxy);
         return concreteJavaProxy;
     }
 
     protected static void initialize(RubyClass concreteJavaProxy) {
         concreteJavaProxy.addMethod("initialize"new org.jruby.internal.runtime.methods.JavaMethod(concreteJavaProxy.) {
             private final CallSite jcreateSite = MethodIndex.getFunctionalCallSite("__jcreate!");
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject[] argsBlock block) {
                 return .call(contextselfselfargsblock);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameBlock block) {
                 return .call(contextselfselfblock);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0Block block) {
                 return .call(contextselfselfarg0block);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1Block block) {
                 return .call(contextselfselfarg0arg1block);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1IRubyObject arg2Block block) {
                 return .call(contextselfselfarg0arg1arg2block);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject[] args) {
                 return .call(contextselfselfargs);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString name) {
                 return .call(contextselfself);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0) {
                 return .call(contextselfselfarg0);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1) {
                 return .call(contextselfselfarg0arg1);
             }
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1IRubyObject arg2) {
                 return .call(contextselfselfarg0arg1arg2);
             }
         });
 
         // We define a custom "new" method to ensure that __jcreate! is getting called,
         // so that if the user doesn't call super in their subclasses, the object will
         // still get set up properly. See JRUBY-4704.
         RubyClass singleton = concreteJavaProxy.getSingletonClass();
         final DynamicMethod oldNew = singleton.searchMethod("new");
         singleton.addMethod("new"new org.jruby.internal.runtime.methods.JavaMethod(singleton.) {
             private final CallSite jcreateSite = MethodIndex.getFunctionalCallSite("__jcreate!");
 
             private boolean needsCreate(IRubyObject recv) {
                 return ((JavaProxy)recv). == null;
             }
 
             @Override
             public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject[] argsBlock block) {
                 IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"argsblock);
                 if (needsCreate(proxy)) .call(contextproxyproxyargsblock);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameBlock block) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"block);
                if (needsCreate(proxy)) .call(contextproxyproxyblock);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0Block block) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0block);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0block);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1Block block) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0arg1block);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0arg1block);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1IRubyObject arg2Block block) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0arg1arg2block);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0arg1arg2block);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject[] args) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"args);
                if (needsCreate(proxy)) .call(contextproxyproxyargs);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString name) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy");
                if (needsCreate(proxy)) .call(contextproxyproxy);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0arg1);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0arg1);
                return proxy;
            }
            @Override
            public IRubyObject call(ThreadContext contextIRubyObject selfRubyModule clazzString nameIRubyObject arg0IRubyObject arg1IRubyObject arg2) {
                IRubyObject proxy = oldNew.call(contextselfclazz"new_proxy"arg0arg1arg2);
                if (needsCreate(proxy)) .call(contextproxyproxyarg0arg1arg2);
                return proxy;
            }
        });
    }
    // This alternate ivar logic is disabled because it can cause self-referencing
    // chains to keep the original object alive. See JRUBY-4832.
//    @Override
//    public Object getVariable(int index) {
//        return getRuntime().getJavaSupport().getJavaObjectVariable(this, index);
//    }
//
//    @Override
//    public void setVariable(int index, Object value) {
//        getRuntime().getJavaSupport().setJavaObjectVariable(this, index, value);
//    }

    
Because we can't physically associate an ID with a Java object, we can only use the identity hashcode here.

Returns:
The identity hashcode for the Java object.
    public IRubyObject id() {
        return getRuntime().newFixnum(System.identityHashCode(getObject()));
    }
    @Override
    public Object toJava(Class type) {
        Object obj = getObject();
        Class cls = obj.getClass();
        if (type.isPrimitive()) {
            if (type == .return null;
            
            if (obj instanceof Number && type != . ||
                    obj instanceof Character && type == . ||
                    obj instanceof Boolean && type == .) {
                // FIXME in more permissive call paths, like invokedynamic, this can allow
                // precision-loading downcasts to happen silently
                return obj;
            } else {
                throw getRuntime().newTypeError("failed to coerce " + cls.getName() + " to " + type.getName());
            }
        } else if (type.isAssignableFrom(cls)) {
            if (. || .getCacheProxy()) {
                getRuntime().getJavaSupport().getObjectProxyCache().put(objthis);
            }
            return obj;
        } else {
            return super.toJava(type);
        }
    }
New to GrepCode? Check out our FAQ X