Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 43d300633b0b
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 48c3e5839177
Choose a head ref
  • 4 commits
  • 4 files changed
  • 1 contributor

Commits on Apr 29, 2015

  1. Copy the full SHA
    df1d09d View commit details
  2. Copy the full SHA
    33453c2 View commit details
  3. Copy the full SHA
    af65da8 View commit details
  4. Copy the full SHA
    48c3e58 View commit details
11 changes: 11 additions & 0 deletions core/src/main/java/org/jruby/RubyModule.java
Original file line number Diff line number Diff line change
@@ -3892,6 +3892,17 @@ public void setCacheProxy(boolean cacheProxy) {
setFlag(USER0_F, cacheProxy);
}

@Override
public Object toJava(Class target) {
if (target == Class.class) { // try java_class for proxy modules
if ( respondsTo("java_class") ) {
return callMethod("java_class").toJava(target);
}
}

return super.toJava(target);
}

/**
* Visit all interpreted methods in this module (and superclasses, if this
* is a class with superclasses) using the given visitor.
38 changes: 18 additions & 20 deletions core/src/main/java/org/jruby/java/proxies/JavaProxy.java
Original file line number Diff line number Diff line change
@@ -313,10 +313,7 @@ public IRubyObject java_send(ThreadContext context, IRubyObject rubyName, IRubyO
RubyArray argTypesAry = argTypes.convertToArray();
Ruby runtime = context.runtime;

if (argTypesAry.size() != 0) {
Class[] argTypesClasses = (Class[])argTypesAry.toArray(new Class[argTypesAry.size()]);
throw JavaMethod.newArgSizeMismatchError(runtime, argTypesClasses);
}
checkArgSizeMismatch(runtime, 0, argTypesAry);

JavaMethod method = new JavaMethod(runtime, getMethod(name));
return method.invokeDirect(getObject());
@@ -328,12 +325,9 @@ public IRubyObject java_send(ThreadContext context, IRubyObject rubyName, IRubyO
RubyArray argTypesAry = argTypes.convertToArray();
Ruby runtime = context.runtime;

if (argTypesAry.size() != 1) {
Class[] argTypesClasses = (Class[])argTypesAry.toArray(new Class[argTypesAry.size()]);
throw JavaMethod.newArgSizeMismatchError(runtime, argTypesClasses);
}
checkArgSizeMismatch(runtime, 1, argTypesAry);

Class argTypeClass = (Class)argTypesAry.eltInternal(0).toJava(Class.class);
Class argTypeClass = (Class) argTypesAry.eltInternal(0).toJava(Class.class);

JavaMethod method = new JavaMethod(runtime, getMethod(name, argTypeClass));
return method.invokeDirect(getObject(), arg0.toJava(argTypeClass));
@@ -345,22 +339,26 @@ public IRubyObject java_send(ThreadContext context, IRubyObject[] args) {

String name = args[0].asJavaString();
RubyArray argTypesAry = args[1].convertToArray();
int argsLen = args.length - 2;
final int argsLen = args.length - 2;

if (argTypesAry.size() != argsLen) {
Class[] argTypesClasses = (Class[])argTypesAry.toArray(new Class[argTypesAry.size()]);
throw JavaMethod.newArgSizeMismatchError(runtime, argTypesClasses);
}
checkArgSizeMismatch(runtime, argsLen, argTypesAry);

Class[] argTypesClasses = (Class[])argTypesAry.toArray(new Class[argsLen]);
Class[] argTypesClasses = (Class[]) argTypesAry.toArray(new Class[argsLen]);

Object[] argsAry = new Object[argsLen];
for (int i = 0; i < argsLen; i++) {
argsAry[i] = args[i + 2].toJava(argTypesClasses[i]);
Object[] javaArgs = new Object[argsLen];
for ( int i = 0; i < argsLen; i++ ) {
javaArgs[i] = args[i + 2].toJava( argTypesClasses[i] );
}

JavaMethod method = new JavaMethod(runtime, getMethod(name, argTypesClasses));
return method.invokeDirect(getObject(), argsAry);
return method.invokeDirect(getObject(), javaArgs);
}

private static void checkArgSizeMismatch(final Ruby runtime, final int expected, final RubyArray argTypes) {
if ( argTypes.size() != expected ) {
Class[] argTypesClasses = (Class[]) argTypes.toArray(new Class[argTypes.size()]);
throw JavaMethod.newArgSizeMismatchError(runtime, argTypesClasses);
}
}

@JRubyMethod
@@ -374,7 +372,7 @@ public IRubyObject java_method(ThreadContext context, IRubyObject rubyName) {
public IRubyObject java_method(ThreadContext context, IRubyObject rubyName, IRubyObject argTypes) {
String name = rubyName.asJavaString();
RubyArray argTypesAry = argTypes.convertToArray();
Class[] argTypesClasses = (Class[])argTypesAry.toArray(new Class[argTypesAry.size()]);
Class[] argTypesClasses = (Class[]) argTypesAry.toArray(new Class[argTypesAry.size()]);

return getRubyMethod(name, argTypesClasses);
}
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ public enum Priority {
RESERVED(0), METHOD(1), FIELD(2), PROTECTED_METHOD(3),
WEAKLY_RESERVED(4), ALIAS(5), PROTECTED_FIELD(6);

private int value;
private final int value;

Priority(int value) {
this.value = value;
47 changes: 42 additions & 5 deletions spec/java_integration/methods/java_send_spec.rb
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
@list = java.util.ArrayList.new
@integer = java.lang.Integer.new(1)
end

it "works with name only for no-arg methods" do
@list.java_send(:toString).should == "[]"
java.lang.System.java_send(:currentTimeMillis).class.should == Fixnum
@@ -15,19 +15,56 @@
@list.java_send(:toString, []).should == "[]"
java.lang.System.java_send(:currentTimeMillis, []).class.should == Fixnum
end

it "works with a signature" do
@list.java_send :add, [Java::int, java.lang.Object], 0, 'foo'
@list.to_s.should == "[foo]"

java_home = java.lang.System.java_send(:getProperty, [java.lang.String], 'java.home')
java_home.should == java.lang.System.getProperty('java.home')

str = java.lang.StringBuilder.new
str.java_send :append, [Java::long], 1234567890
str.to_s.should == '1234567890'
str.java_send :append, [java.lang.String], " str1"
str.to_s.should == '1234567890 str1'
str.java_send :append, [java.lang.CharSequence], " str2"
str.to_s.should == '1234567890 str1 str2'
str.java_send :append, [Java::char[], Java::int, Java::int], " str3".to_java.to_char_array, 0, 4
str.to_s.should == '1234567890 str1 str2 str'
end

it "works with package-level classes" do
array = Java::int[16].new
array[1] = 10; array[2] = 20

buffer = java.nio.IntBuffer.wrap array # returns a Java::JavaNio::HeapIntBuffer
buffer.java_send(:get, [ Java::int ], 1).should == 10
buffer.java_send(:get).should == 0
buffer.java_send(:get).should == 10
buffer.java_send(:get, []).should == 20
end


it "works with private classes" do
array = Java::int[16].new
array[1] = 10; array[2] = 20

map = java.util.HashMap.new
key_type = java.lang.String.java_class
val_type = java.lang.Number.java_class

map = java.util.Collections.checkedMap(map, key_type, val_type) # returns a private CheckedMap instance
map.java_send(:clear)
map.java_send(:put, [ Java::JavaLang::Object, Java::JavaLang::Object ], '1', 1.to_java)
map.java_send(:get, [ Java::JavaLang::Object ], '').should == nil
map.java_send(:get, [ Java::JavaLang::Object ], '1').should == 1
end

it "raises NameError if the method can't be found" do
lambda do
@list.java_send :foobar
end.should raise_error(NameError)

lambda do
@list.java_send :add, [Java::long, java.lang.Object], 0, 'foo'
end.should raise_error(NameError)
@@ -40,7 +77,7 @@
java.lang.System.java_send :getProperty, [Java::long, Java::long], 0, 0
end.should raise_error(NameError)
end

it "raises ArgumentError if type count doesn't match arg count" do
lambda do
@list.java_send :add, [Java::int, java.lang.Object], 0, 'foo', 'bar'