* Eliminate visibility checking for almost all fcall and vcall paths.
[jruby.git] / src / org / jruby / java / proxies / JavaProxy.java
blob00dd69b261d69b03883c0407f788ec31fd390dca
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
6 package org.jruby.java.proxies;
8 import org.jruby.Ruby;
9 import org.jruby.RubyClass;
10 import org.jruby.RubyObject;
11 import org.jruby.anno.JRubyMethod;
12 import org.jruby.javasupport.Java;
13 import org.jruby.javasupport.JavaObject;
14 import org.jruby.javasupport.util.RuntimeHelpers;
15 import org.jruby.runtime.Block;
16 import org.jruby.runtime.CallType;
17 import org.jruby.runtime.ObjectAllocator;
18 import org.jruby.runtime.ThreadContext;
19 import org.jruby.runtime.builtin.IRubyObject;
21 /**
23 * @author headius
25 public class JavaProxy extends RubyObject {
26 public JavaProxy(Ruby runtime, RubyClass klazz) {
27 super(runtime, klazz);
30 public static RubyClass createJavaProxy(ThreadContext context) {
31 Ruby runtime = context.getRuntime();
33 RubyClass javaProxy = runtime.defineClass("JavaProxy", runtime.getObject(), new ObjectAllocator() {
34 public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
35 return new JavaProxy(runtime, klazz);
37 });
39 RubyClass singleton = javaProxy.getSingletonClass();
41 singleton.addReadWriteAttribute(context, "java_class");
43 javaProxy.defineAnnotatedMethods(JavaProxy.class);
44 javaProxy.includeModule(runtime.fastGetModule("JavaProxyMethods"));
46 return javaProxy;
49 @JRubyMethod(frame = true, meta = true)
50 public static IRubyObject inherited(ThreadContext context, IRubyObject recv, IRubyObject subclass) {
51 IRubyObject subJavaClass = RuntimeHelpers.invoke(context, subclass, "java_class");
52 if (subJavaClass.isNil()) {
53 subJavaClass = RuntimeHelpers.invoke(context, recv, "java_class");
54 RuntimeHelpers.invoke(context, subclass, "java_class=", subJavaClass);
56 return recv.callSuper(context, new IRubyObject[] {subclass}, Block.NULL_BLOCK);
59 @JRubyMethod(meta = true)
60 public static IRubyObject singleton_class(IRubyObject recv) {
61 return ((RubyClass)recv).getSingletonClass();
64 @JRubyMethod(name = "[]", meta = true, rest = true)
65 public static IRubyObject op_aref(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
66 IRubyObject javaClass = RuntimeHelpers.invoke(context, recv, "java_class");
67 if (args.length > 0) {
68 // construct new array proxy (ArrayJavaProxy)
69 IRubyObject[] newArgs = new IRubyObject[args.length + 1];
70 newArgs[0] = javaClass;
71 System.arraycopy(args, 0, newArgs, 1, args.length);
72 return context.getRuntime().fastGetClass("ArrayJavaProxyCreator").newInstance(context, newArgs, Block.NULL_BLOCK);
73 } else {
74 return Java.get_proxy_class(javaClass, RuntimeHelpers.invoke(context, javaClass, "array_class"));
78 @JRubyMethod(meta = true)
79 public static IRubyObject new_instance_for(IRubyObject recv, IRubyObject arg0) {
80 return Java.new_instance_for(recv, arg0);
83 @JRubyMethod(meta = true)
84 public static IRubyObject to_java_object(IRubyObject recv) {
85 return Java.to_java_object(recv);
88 public Object unwrap() {
89 return ((JavaObject)dataGetStruct()).getValue();