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: f10f15eee00f
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 1d0056cf4706
Choose a head ref
  • 6 commits
  • 6 files changed
  • 1 contributor

Commits on Jul 27, 2016

  1. Copy the full SHA
    a75adf0 View commit details
  2. Copy the full SHA
    6f6728f View commit details
  3. Copy the full SHA
    c0c7f50 View commit details
  4. Copy the full SHA
    41c675b View commit details
  5. Copy the full SHA
    ab5c470 View commit details
  6. Copy the full SHA
    1d0056c View commit details
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -111,8 +111,8 @@ matrix:
- env: JT='test mri'
jdk: oraclejdk8
- env: JT='test gems' JAVA_OPTS="$JAVA_OPTS -Xmx512m" HAS_REDIS=true
- env: PHASE='-Pj2ee'
jdk: oraclejdk7
#- env: PHASE='-Pj2ee'
# jdk: oraclejdk7
# NOTE: build seems to never start (waited for any to finish for more than a day) - probably a travis-ci bug
#- env: PHASE='-Pmain'
# sudo: required
22 changes: 11 additions & 11 deletions core/src/main/java/org/jruby/javasupport/Java.java
Original file line number Diff line number Diff line change
@@ -435,6 +435,7 @@ static RubyModule createProxyClassForClass(final Ruby runtime, final Class<?> cl
superClass = javaSupport.getArrayProxyClass();
} else if (clazz.isPrimitive()) {
superClass = javaSupport.getConcreteProxyClass();
// NOTE: but the class methods such as 'new' will be removed (Initializer.setupProxyClass)
} else if (clazz == Object.class) {
superClass = javaSupport.getConcreteProxyClass();
} else {
@@ -450,7 +451,7 @@ static RubyModule createProxyClassForClass(final Ruby runtime, final Class<?> cl
if (clazz.isInterface()) {
generateInterfaceProxy(runtime, clazz, proxy);
} else {
generateClassProxy(runtime, clazz, (RubyClass) proxy, superClass, javaSupport);
generateClassProxy(runtime, clazz, (RubyClass) proxy, superClass);
}
} finally {
javaSupport.endProxy(clazz);
@@ -460,7 +461,7 @@ static RubyModule createProxyClassForClass(final Ruby runtime, final Class<?> cl
}

private static void generateInterfaceProxy(final Ruby runtime, final Class javaClass, final RubyModule proxy) {
assert javaClass.isInterface() : "not an interface: " + javaClass;
assert javaClass.isInterface();

// include any interfaces we extend
final Class<?>[] extended = javaClass.getInterfaces();
@@ -472,20 +473,20 @@ private static void generateInterfaceProxy(final Ruby runtime, final Class javaC
addToJavaPackageModule(proxy);
}

private static void generateClassProxy(Ruby runtime, Class<?> clazz, RubyClass proxy, RubyClass superClass, JavaSupport javaSupport) {
if (clazz.isArray()) {
createProxyClass(runtime, proxy, clazz, true);
private static void generateClassProxy(Ruby runtime, Class<?> clazz, RubyClass proxy, RubyClass superClass) {
if ( clazz.isArray() ) {
createProxyClass(runtime, proxy, clazz, superClass, true);

if ( clazz.getComponentType() == byte.class ) {
proxy.defineAnnotatedMethods( ByteArrayProxyMethods.class ); // to_s
}
}
else if ( clazz.isPrimitive() ) {
createProxyClass(runtime, proxy, clazz, true);
createProxyClass(runtime, proxy, clazz, superClass, true);
}
else if ( clazz == Object.class ) {
// java.lang.Object is added at root of java proxy classes
createProxyClass(runtime, proxy, clazz, true);
createProxyClass(runtime, proxy, clazz, superClass, true);
if (NEW_STYLE_EXTENSION) {
proxy.getMetaClass().defineAnnotatedMethods(NewStyleExtensionInherited.class);
} else {
@@ -494,7 +495,7 @@ else if ( clazz == Object.class ) {
addToJavaPackageModule(proxy);
}
else {
createProxyClass(runtime, proxy, clazz, false);
createProxyClass(runtime, proxy, clazz, superClass, false);
// include interface modules into the proxy class
final Class<?>[] interfaces = clazz.getInterfaces();
for ( int i = interfaces.length; --i >= 0; ) {
@@ -519,9 +520,8 @@ public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule claz
}

private static RubyClass createProxyClass(final Ruby runtime,
final RubyClass proxyClass, final Class<?> javaClass, boolean invokeInherited) {

final RubyClass superClass = proxyClass.getSuperClass();
final RubyClass proxyClass, final Class<?> javaClass,
final RubyClass superClass, boolean invokeInherited) {

proxyClass.makeMetaClass( superClass.getMetaClass() );

Original file line number Diff line number Diff line change
@@ -16,23 +16,16 @@
/**
* Created by headius on 2/26/15.
*/
public class ClassInitializer extends Initializer {
public ClassInitializer(Ruby runtime, Class<?> javaClass) {
final class ClassInitializer extends Initializer {

ClassInitializer(Ruby runtime, Class<?> javaClass) {
super(runtime, javaClass);
}

@Override
public RubyModule initialize(RubyModule proxy) {
RubyClass proxyClass = (RubyClass)proxy;
Class<?> superclass = javaClass.getSuperclass();

final State state = new State(runtime, superclass);

proxyClass.setReifiedClass(javaClass);

if ( javaClass.isArray() || javaClass.isPrimitive() ) {
return proxy;
}
public RubyClass initialize(final RubyModule proxy) {
final RubyClass proxyClass = (RubyClass) proxy;
final State state = new State(runtime, javaClass.getSuperclass());

setupClassFields(javaClass, state);
setupClassMethods(javaClass, state);
@@ -84,9 +77,9 @@ else if ( length > offset + 1 ) { // skip '$'
installClassConstructors(proxyClass, state);
installClassClasses(javaClass, proxyClass);

proxy.getName(); // trigger calculateName()
proxyClass.getName(); // trigger calculateName()

return proxy;
return proxyClass;
}

private static void installClassInstanceMethods(final RubyClass proxy, final Initializer.State state) {
33 changes: 29 additions & 4 deletions core/src/main/java/org/jruby/javasupport/binding/Initializer.java
Original file line number Diff line number Diff line change
@@ -81,18 +81,43 @@ public Initializer(Ruby runtime, Class javaClass) {
this.javaClass = javaClass;
}

public static RubyModule setupProxyClass(Ruby runtime, final Class<?> javaClass, final RubyClass proxy) {
public static RubyModule setupProxyClass(Ruby runtime, final Class<?> javaClass, RubyClass proxy) {
setJavaClassFor(javaClass, proxy);

return new ClassInitializer(runtime, javaClass).initialize(proxy);
proxy.setReifiedClass((Class) javaClass);

if ( javaClass.isArray() ) {
flagAsJavaProxy(proxy); return proxy;
}

if ( javaClass.isPrimitive() ) {
final RubyClass proxySingleton = proxy.getSingletonClass();
proxySingleton.undefineMethod("new"); // remove ConcreteJavaProxy class method 'new'
if ( javaClass == Void.TYPE ) {
// special treatment ... while Java::int[4] is OK Java::void[2] is NOT!
proxySingleton.undefineMethod("[]"); // from JavaProxy
proxySingleton.undefineMethod("new_array"); // from JavaProxy
}
flagAsJavaProxy(proxy); return proxy;
}

proxy = new ClassInitializer(runtime, javaClass).initialize(proxy);
flagAsJavaProxy(proxy); return proxy;
}

public static RubyModule setupProxyModule(Ruby runtime, final Class<?> javaClass, final RubyModule proxy) {
public static RubyModule setupProxyModule(Ruby runtime, final Class<?> javaClass, RubyModule proxy) {
setJavaClassFor(javaClass, proxy);

assert javaClass.isInterface();

return new InterfaceInitializer(runtime, javaClass).initialize(proxy);
proxy = new InterfaceInitializer(runtime, javaClass).initialize(proxy);
flagAsJavaProxy(proxy); return proxy;
}

private static void flagAsJavaProxy(final RubyModule proxy) {
// flag the class as a Java class proxy.
proxy.setJavaProxy(true);
proxy.getSingletonClass().setJavaProxy(true);
}

protected static void addField(
Original file line number Diff line number Diff line change
@@ -13,9 +13,9 @@
/**
* Created by headius on 2/26/15.
*/
public class InterfaceInitializer extends Initializer {
final class InterfaceInitializer extends Initializer {

public InterfaceInitializer(Ruby runtime, Class<?> javaClass) {
InterfaceInitializer(Ruby runtime, Class<?> javaClass) {
super(runtime, javaClass);
}

@@ -55,10 +55,6 @@ public RubyModule initialize(RubyModule proxy) {
runtime.getJavaSupport().getStaticAssignedNames().get(javaClass).putAll(state.staticNames);
runtime.getJavaSupport().getInstanceAssignedNames().get(javaClass).clear();

// flag the class as a Java class proxy.
proxy.setJavaProxy(true);
proxy.getSingletonClass().setJavaProxy(true);

installClassFields(proxy, state);
installClassStaticMethods(proxy, state);
installClassClasses(javaClass, proxy);
42 changes: 42 additions & 0 deletions test/jruby/test_higher_javasupport.rb
Original file line number Diff line number Diff line change
@@ -466,6 +466,27 @@ def test_primitives
rescue TypeError => e
assert /can not extend .* long/.match(e.message)
end

begin
Java::double.new; fail "expected to raise"
rescue NoMethodError
end
begin
Java::short.synchronized {}; fail "expected to raise"
rescue NoMethodError
end
begin
Java::float.java_object; fail "expected to raise"
rescue NoMethodError
end

assert Java::byte.hash != Java::float.hash
assert_false Java::byte == Java::float
assert_true Java::byte == Java::byte
assert_true Java::long.eql? Java::long
assert_false Java::int.eql? Java::long

assert_equal 2, Java::short.new_array(2).length
end

def test_void
@@ -488,6 +509,27 @@ def test_void
p Java
p Java::void
end

begin
Java::void.new; fail "expected to raise"
rescue NoMethodError
end
begin
Java::void[1].new; fail "expected to raise"
rescue NoMethodError
end
begin
Java::void[].new; fail "expected to raise"
rescue NoMethodError
end
begin
Java::void.new_array; fail "expected to raise"
rescue NoMethodError
end
begin
Java::void.synchronized; fail "expected to raise"
rescue NoMethodError
end
end

class IntLike