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: f4ff88970404
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: dd9cf5f96b43
Choose a head ref

Commits on Mar 25, 2015

  1. use 'new' CallableSelector methods (with IntHashMap cache) for better…

    … performance
    
    + make the internals do less casting by making private methods type generic
    
    ... also made some of the callable concrete classes final
    kares committed Mar 25, 2015
    Copy the full SHA
    805ccb8 View commit details
  2. cleanup JavaUtil - use implicit primitive boxing (instead of explicit…

    …) + less array[i] access
    kares committed Mar 25, 2015
    Copy the full SHA
    ce714cd View commit details
  3. Copy the full SHA
    765fee8 View commit details
  4. Copy the full SHA
    b390857 View commit details
  5. Copy the full SHA
    7bf94dd View commit details
  6. Copy the full SHA
    58487dd View commit details
  7. Copy the full SHA
    250976c View commit details
  8. cleanup JavaProxyConstructor - share invocation handler + no fixnums …

    …on arg conversion
    
    ... also added getJavaProxyConstructor onto JavaSupport - so there's less lookup going on
    kares committed Mar 25, 2015
    Copy the full SHA
    f22aed3 View commit details
  9. Copy the full SHA
    5a7501f View commit details
  10. extract another (in-line) invocation handler impl into an inner stati…

    …c class + better naming
    kares committed Mar 25, 2015
    Copy the full SHA
    dbc7954 View commit details
  11. test (and fix) inspect / to_s for Java callables + share inspectParam…

    …eterTypes for re-use
    kares committed Mar 25, 2015
    Copy the full SHA
    530f72b View commit details
  12. JavaClass - share more internals and test some of the method/construc…

    …tor reflection
    
    ... also avoided ArrayIndexOutOfBoundException since we checked args.length late
    kares committed Mar 25, 2015
    Copy the full SHA
    c80f1c4 View commit details
  13. Copy the full SHA
    b7dbefe View commit details

Commits on Mar 26, 2015

  1. Copy the full SHA
    8361137 View commit details
  2. Copy the full SHA
    ed54a08 View commit details
  3. Copy the full SHA
    18f91f7 View commit details
  4. as (most) Java invokers will not have overrides - they won't use the …

    …internal cache
    
    ... for loading up JRuby's built-in JI classes this saves up allocating > 2100 maps
    
    also we shall now use "more-compact" short term garbage (array[] list) chunks
    kares committed Mar 26, 2015
    Copy the full SHA
    8cdb5ec View commit details
  5. Copy the full SHA
    27303df View commit details
  6. Copy the full SHA
    c1e3392 View commit details
  7. Copy the full SHA
    f002154 View commit details
  8. Copy the full SHA
    286b59e View commit details
  9. Copy the full SHA
    787e4ac View commit details
  10. Copy the full SHA
    e4a6982 View commit details
  11. Copy the full SHA
    55a98cc View commit details
  12. Copy the full SHA
    d6aac6a View commit details
  13. handle nested array.to_java conversion where element is already an ar…

    …ray + cleanup
    
    najs to have ... has been reported as well #1354
    kares committed Mar 26, 2015
    Copy the full SHA
    d81a52f View commit details
  14. DRY-up interface-template impl ... (extracted some anonymous into inn…

    …er classes)
    
    also added some more interface proxy related tests
    kares committed Mar 26, 2015
    Copy the full SHA
    0cc5be1 View commit details
  15. Copy the full SHA
    24f3384 View commit details
  16. Copy the full SHA
    81fa52f View commit details
  17. Copy the full SHA
    1e85d93 View commit details
  18. Copy the full SHA
    2413567 View commit details
  19. Copy the full SHA
    8a1f514 View commit details
  20. Copy the full SHA
    dd9cf5f View commit details
Showing with 2,036 additions and 1,364 deletions.
  1. +81 −88 core/src/main/java/org/jruby/java/addons/ArrayJavaAddons.java
  2. +19 −19 core/src/main/java/org/jruby/java/addons/KernelJavaAddons.java
  3. +94 −26 core/src/main/java/org/jruby/java/dispatch/CallableSelector.java
  4. +3 −3 core/src/main/java/org/jruby/java/invokers/ConstructorInvoker.java
  5. +3 −3 core/src/main/java/org/jruby/java/invokers/InstanceMethodInvoker.java
  6. +193 −159 core/src/main/java/org/jruby/java/invokers/RubyToJavaInvoker.java
  7. +7 −6 core/src/main/java/org/jruby/java/invokers/SingletonMethodInvoker.java
  8. +9 −14 core/src/main/java/org/jruby/java/invokers/StaticMethodInvoker.java
  9. +29 −8 core/src/main/java/org/jruby/java/proxies/ArrayJavaProxy.java
  10. +29 −19 core/src/main/java/org/jruby/java/proxies/ArrayJavaProxyCreator.java
  11. +235 −151 core/src/main/java/org/jruby/java/proxies/JavaInterfaceTemplate.java
  12. +19 −18 core/src/main/java/org/jruby/java/proxies/JavaProxy.java
  13. +65 −32 core/src/main/java/org/jruby/javasupport/Java.java
  14. +18 −22 core/src/main/java/org/jruby/javasupport/JavaArrayUtilities.java
  15. +25 −22 core/src/main/java/org/jruby/javasupport/JavaCallable.java
  16. +100 −86 core/src/main/java/org/jruby/javasupport/JavaClass.java
  17. +17 −1 core/src/main/java/org/jruby/javasupport/JavaConstructor.java
  18. +22 −5 core/src/main/java/org/jruby/javasupport/JavaField.java
  19. +47 −27 core/src/main/java/org/jruby/javasupport/JavaMethod.java
  20. +7 −0 core/src/main/java/org/jruby/javasupport/JavaSupport.java
  21. +296 −297 core/src/main/java/org/jruby/javasupport/JavaUtil.java
  22. +32 −0 core/src/main/java/org/jruby/javasupport/ParameterTypes.java
  23. +79 −88 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyClass.java
  24. +1 −1 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyClassFactory.java
  25. +164 −181 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyConstructor.java
  26. +19 −14 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyReflectionObject.java
  27. +35 −33 core/src/main/java/org/jruby/util/CodegenUtils.java
  28. +42 −1 core/src/main/java/org/jruby/util/collections/IntHashMap.java
  29. +297 −7 test/test_higher_javasupport.rb
  30. +38 −12 test/test_instantiating_interfaces.rb
  31. +11 −21 test/test_java_extension.rb
169 changes: 81 additions & 88 deletions core/src/main/java/org/jruby/java/addons/ArrayJavaAddons.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.jruby.java.addons;

import java.lang.reflect.Array;
import org.jruby.Ruby;
import org.jruby.RubyArray;
import org.jruby.RubyFixnum;
@@ -10,121 +9,115 @@
import org.jruby.runtime.builtin.IRubyObject;

public class ArrayJavaAddons {
@JRubyMethod
public static IRubyObject copy_data(
ThreadContext context, IRubyObject rubyArray, IRubyObject javaArray,
IRubyObject fillValue) {
JavaArray javaArrayJavaObj = (JavaArray)javaArray.dataGetStruct();

@JRubyMethod(name = "copy_data")
public static IRubyObject copy_data(final ThreadContext context,
final IRubyObject fromRuby, final IRubyObject toJava, final IRubyObject fillValue) {
JavaArray javaArray = (JavaArray) toJava.dataGetStruct();
final int javaLength = javaArray.getLength();
final Class<?> targetType = javaArray.getComponentType();

Object fillJavaObject = null;
int javaLength = (int)javaArrayJavaObj.length().getLongValue();
Class targetType = javaArrayJavaObj.getComponentType();

if (!fillValue.isNil()) {
fillJavaObject = fillValue.toJava(targetType);
}

RubyArray array = null;
int rubyLength;
if (rubyArray instanceof RubyArray) {
array = (RubyArray)rubyArray;
rubyLength = ((RubyArray)rubyArray).getLength();
if ( ! fillValue.isNil() ) fillJavaObject = fillValue.toJava(targetType);

RubyArray rubyArray = null;
if (fromRuby instanceof RubyArray) {
rubyArray = (RubyArray) fromRuby;
} else {
rubyLength = 0;
fillJavaObject = rubyArray.toJava(targetType);
fillJavaObject = fromRuby.toJava(targetType);
}

int i = 0;
for (; i < rubyLength && i < javaLength; i++) {
javaArrayJavaObj.setWithExceptionHandling(i, array.entry(i).toJava(targetType));
if ( rubyArray != null ) {
final int rubyLength = rubyArray.getLength();
for (; i < rubyLength && i < javaLength; i++) {
javaArray.setWithExceptionHandling(i, rubyArray.eltInternal(i).toJava(targetType));
}
}
if (i < javaLength && fillJavaObject != null) {
javaArrayJavaObj.fillWithExceptionHandling(i, javaLength, fillJavaObject);

if ( i < javaLength && fillJavaObject != null ) {
javaArray.fillWithExceptionHandling(i, javaLength, fillJavaObject);
}
return javaArray;

return toJava;
}
@JRubyMethod
public static IRubyObject copy_data_simple(
ThreadContext context, IRubyObject from, IRubyObject to) {
JavaArray javaArray = (JavaArray)to.dataGetStruct();
RubyArray rubyArray = (RubyArray)from;
copyDataToJavaArray(context, rubyArray, javaArray);
return to;

@JRubyMethod(name = { "copy_data", "copy_data_simple" })
public static IRubyObject copy_data(final ThreadContext context,
IRubyObject fromRuby, IRubyObject toJava) {
JavaArray javaArray = (JavaArray) toJava.dataGetStruct();
RubyArray rubyArray = (RubyArray) fromRuby;

copyDataToJavaArray(rubyArray, javaArray, 0);

return toJava;
}

public static void copyDataToJavaArray(
ThreadContext context, RubyArray rubyArray, JavaArray javaArray) {
int javaLength = (int)javaArray.length().getLongValue();
Class targetType = javaArray.getComponentType();

int rubyLength = rubyArray.getLength();

int i = 0;
for (; i < rubyLength && i < javaLength; i++) {
javaArray.setWithExceptionHandling(i, rubyArray.entry(i).toJava(targetType));

@Deprecated // not used
public static void copyDataToJavaArray(final ThreadContext context,
final RubyArray rubyArray, final JavaArray javaArray) {
copyDataToJavaArray(rubyArray, javaArray, 0);
}

private static void copyDataToJavaArray(
final RubyArray rubyArray, final JavaArray javaArray, int offset) {
int length = javaArray.getLength();
if ( length > rubyArray.getLength() ) length = rubyArray.getLength();

final Class<?> targetType = javaArray.getComponentType();
for ( int i = offset; i < length; i++ ) {
javaArray.setWithExceptionHandling(i, rubyArray.eltInternal(i).toJava(targetType));
}
}

@JRubyMethod
public static IRubyObject dimensions(ThreadContext context, IRubyObject maybeArray) {
Ruby runtime = context.runtime;
if (!(maybeArray instanceof RubyArray)) {
return runtime.newEmptyArray();
}
RubyArray rubyArray = (RubyArray)maybeArray;
RubyArray dims = runtime.newEmptyArray();

return dimsRecurse(context, rubyArray, dims, 0);
public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray) {
return dimensions(context, rubyArray, context.runtime.newEmptyArray());
}

@JRubyMethod
public static IRubyObject dimensions(ThreadContext context, IRubyObject maybeArray, IRubyObject dims) {
Ruby runtime = context.runtime;
if (!(maybeArray instanceof RubyArray)) {
public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims) {
final Ruby runtime = context.runtime;
if ( ! ( rubyArray instanceof RubyArray ) ) {
return runtime.newEmptyArray();
}
assert dims instanceof RubyArray;

RubyArray rubyArray = (RubyArray)maybeArray;

return dimsRecurse(context, rubyArray, (RubyArray)dims, 0);

return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, 0);
}

@JRubyMethod
public static IRubyObject dimensions(ThreadContext context, IRubyObject maybeArray, IRubyObject dims, IRubyObject index) {
Ruby runtime = context.runtime;
if (!(maybeArray instanceof RubyArray)) {
public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims, IRubyObject index) {
final Ruby runtime = context.runtime;
if ( ! ( rubyArray instanceof RubyArray ) ) {
return runtime.newEmptyArray();
}
assert dims instanceof RubyArray;
assert index instanceof RubyFixnum;

RubyArray rubyArray = (RubyArray)maybeArray;

return dimsRecurse(context, rubyArray, (RubyArray)dims, (int)((RubyFixnum)index).getLongValue());

final int i = (int) ((RubyFixnum) index).getLongValue();
return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, i);
}

private static RubyArray dimsRecurse(ThreadContext context, RubyArray rubyArray, RubyArray dims, int index) {
Ruby runtime = context.runtime;

while (dims.size() <= index) {
dims.append(RubyFixnum.zero(runtime));
private static RubyArray calcDimensions(final Ruby runtime,
final RubyArray array, final RubyArray dims, final int index) {

while ( dims.size() <= index ) {
dims.append( RubyFixnum.zero(runtime) );
}

if (rubyArray.size() > ((RubyFixnum)dims.eltInternal(index)).getLongValue()) {
dims.eltInternalSet(index, RubyFixnum.newFixnum(runtime, rubyArray.size()));

final long dim = ((RubyFixnum) dims.eltInternal(index)).getLongValue();
if ( array.size() > dim ) {
dims.eltInternalSet(index, RubyFixnum.newFixnum(runtime, array.size()));
}

for (int i = 0; i < rubyArray.size(); i++) {
if (rubyArray.eltInternal(i) instanceof RubyArray) {
dimsRecurse(context, (RubyArray)rubyArray.eltInternal(i), dims, 1);

for ( int i = 0; i < array.size(); i++ ) {
final IRubyObject element = array.eltInternal(i);
if ( element instanceof RubyArray ) {
calcDimensions(runtime, (RubyArray) element, dims, 1);
}
}

return dims;
}
}
38 changes: 19 additions & 19 deletions core/src/main/java/org/jruby/java/addons/KernelJavaAddons.java
Original file line number Diff line number Diff line change
@@ -46,28 +46,25 @@ public static IRubyObject rbRaise(ThreadContext context, IRubyObject recv, IRuby
}

@JRubyMethod
public static IRubyObject to_java(ThreadContext context, IRubyObject fromObject) {
if (fromObject instanceof RubyArray) {
return context.runtime.getJavaSupport().getObjectJavaClass().javaArrayFromRubyArray(context, fromObject);
} else {
return Java.getInstance(context.runtime, fromObject.toJava(Object.class));
public static IRubyObject to_java(ThreadContext context, final IRubyObject fromObject) {
if ( fromObject instanceof RubyArray ) {
final JavaClass targetType = context.runtime.getJavaSupport().getObjectJavaClass();
return targetType.javaArrayFromRubyArray(context, (RubyArray) fromObject);
}
return Java.getInstance(context.runtime, fromObject.toJava(Object.class));
}

@JRubyMethod
public static IRubyObject to_java(ThreadContext context, IRubyObject fromObject, IRubyObject type) {
if (type.isNil()) {
return to_java(context, fromObject);
}
public static IRubyObject to_java(ThreadContext context, final IRubyObject fromObject, final IRubyObject type) {
if ( type.isNil() ) return to_java(context, fromObject);

Ruby runtime = context.runtime;
JavaClass targetType = getTargetType(context, runtime, type);
final Ruby runtime = context.runtime;
final JavaClass targetType = getTargetType(context, runtime, type);

if (fromObject instanceof RubyArray) {
return targetType.javaArrayFromRubyArray(context, fromObject);
} else {
return Java.getInstance(runtime, fromObject.toJava(targetType.javaClass()));
if ( fromObject instanceof RubyArray ) {
return targetType.javaArrayFromRubyArray(context, (RubyArray) fromObject);
}
return Java.getInstance(runtime, fromObject.toJava(targetType.javaClass()));
}

@JRubyMethod(rest = true)
@@ -118,11 +115,14 @@ private static JavaClass getTargetType(ThreadContext context, Ruby runtime, IRub
if (type instanceof RubyString || type instanceof RubySymbol) {
targetType = runtime.getJavaSupport().getNameClassMap().get(type.asJavaString());
if (targetType == null) targetType = JavaClass.forNameVerbose(runtime, type.asJavaString());
} else if (type instanceof RubyModule && type.respondsTo("java_class")) {
}
else if (type instanceof RubyModule && type.respondsTo("java_class")) {
targetType = (JavaClass) Helpers.invoke(context, type, "java_class");
} else if (type instanceof JavaProxy) {
if (((JavaProxy)type).getObject() instanceof Class) {
targetType = JavaClass.get(runtime, (Class)((JavaProxy)type).getObject());
}
else if (type instanceof JavaProxy) {
final Object wrapped = ((JavaProxy) type).getObject();
if ( wrapped instanceof Class ) {
targetType = JavaClass.get(runtime, (Class) wrapped);
} else {
throw runtime.newTypeError("not a valid target type: " + type);
}
Loading