Skip to content

Commit 31f1ed6

Browse files
committed
Only set up Java:: constants when accessed directly
Previously whenever we see a new type of Java object, we both set up the proxy class AND set the constant. If that object's class is not from the typical Java integration classloader hierarchy, it will pollute the Java:: module with a normally inaccessible entry. This change only sets up the constant when it is accessed through the normal package reference, rather than when first seen. Fixes #8156
1 parent 3fedd5c commit 31f1ed6

3 files changed

Lines changed: 20 additions & 13 deletions

File tree

core/src/main/java/org/jruby/javasupport/Java.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,14 @@ public static RubyModule getProxyClass(Ruby runtime, JavaClass javaClass) {
414414

415415
@SuppressWarnings("deprecation")
416416
public static RubyModule getProxyClass(final Ruby runtime, final Class<?> clazz) {
417+
return getProxyClass(runtime, clazz, false);
418+
}
419+
420+
@SuppressWarnings("deprecation")
421+
public static RubyModule getProxyClass(final Ruby runtime, final Class<?> clazz, boolean setConstant) {
417422
RubyModule proxy = runtime.getJavaSupport().getUnfinishedProxy(clazz);
418423
if (proxy != null) return proxy;
419-
return runtime.getJavaSupport().getProxyClassFromCache(clazz);
424+
return runtime.getJavaSupport().getProxyClassFromCache(clazz, setConstant);
420425
}
421426

422427
// expected to handle Java proxy (Ruby) sub-classes as well
@@ -473,7 +478,6 @@ private static void generateInterfaceProxy(final Ruby runtime, final Class javaC
473478
proxy.includeModule(extModule);
474479
}
475480
Initializer.setupProxyModule(runtime, javaClass, proxy);
476-
addToJavaPackageModule(proxy);
477481
}
478482

479483
private static void generateClassProxy(Ruby runtime, Class<?> clazz, RubyClass proxy, RubyClass superClass) {
@@ -495,7 +499,6 @@ else if ( clazz == Object.class ) {
495499
} else {
496500
proxy.getMetaClass().defineAnnotatedMethods(OldStyleExtensionInherited.class);
497501
}
498-
addToJavaPackageModule(proxy);
499502
}
500503
else {
501504
createProxyClass(runtime, proxy, clazz, superClass, false);
@@ -504,9 +507,6 @@ else if ( clazz == Object.class ) {
504507
for ( int i = interfaces.length; --i >= 0; ) {
505508
proxy.includeModule(getInterfaceModule(runtime, interfaces[i]));
506509
}
507-
if ( Modifier.isPublic(clazz.getModifiers()) ) {
508-
addToJavaPackageModule(proxy);
509-
}
510510
}
511511

512512
// JRUBY-1000, fail early when attempting to subclass a final Java class;
@@ -824,9 +824,7 @@ private static <T extends ParameterTypes> T checkCallableForArity(final int arit
824824

825825
// package scheme 2: separate module for each full package name, constructed
826826
// from the camel-cased package segments: Java::JavaLang::Object,
827-
private static void addToJavaPackageModule(RubyModule proxyClass) {
828-
final Ruby runtime = proxyClass.getRuntime();
829-
final Class<?> clazz = (Class<?>)proxyClass.dataGetStruct();
827+
static void addToJavaPackageModule(Ruby runtime, Class<?> clazz, RubyModule proxyClass) {
830828
final String fullName;
831829
if ( ( fullName = clazz.getName() ) == null ) return;
832830

@@ -1074,7 +1072,7 @@ private static RubyModule getProxyClassOrNull(final Ruby runtime, final String c
10741072
} catch (ClassNotFoundException ex) { // used to catch NoClassDefFoundError for whatever reason
10751073
return null;
10761074
}
1077-
return getProxyClass(runtime, clazz);
1075+
return getProxyClass(runtime, clazz, true);
10781076
}
10791077

10801078
private static int mapMajorMinorClassVersionToJavaVersion(String msg, final int offset) {

core/src/main/java/org/jruby/javasupport/JavaPackage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ private RubyModule relativeJavaClassOrPackage(final ThreadContext context,
189189

190190
RubyModule relativeJavaProxyClass(final Ruby runtime, final IRubyObject name) {
191191
final String fullName = packageRelativeName( name.toString() ).toString();
192-
return Java.getProxyClass(runtime, Java.getJavaClass(runtime, fullName));
192+
return Java.getProxyClass(runtime, Java.getJavaClass(runtime, fullName), true);
193193
}
194194

195195
@JRubyMethod(name = "respond_to?")

core/src/main/java/org/jruby/javasupport/JavaSupport.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.jruby.util.collections.ClassValueCalculator;
5151

5252
import java.lang.reflect.Member;
53+
import java.lang.reflect.Modifier;
5354
import java.util.Map;
5455
import java.util.Set;
5556
import java.util.concurrent.ConcurrentHashMap;
@@ -369,8 +370,16 @@ final RubyModule getUnfinishedProxy(Class clazz) {
369370
return null;
370371
}
371372

372-
RubyModule getProxyClassFromCache(Class clazz) {
373-
return proxyClassCache.get(clazz);
373+
RubyModule getProxyClassFromCache(Class clazz, boolean setConstant) {
374+
RubyModule proxy = proxyClassCache.get(clazz);
375+
376+
if (setConstant) {
377+
if ( Modifier.isPublic(clazz.getModifiers()) ) {
378+
Java.addToJavaPackageModule(runtime, clazz, proxy);
379+
}
380+
}
381+
382+
return proxy;
374383
}
375384

376385
}

0 commit comments

Comments
 (0)