Skip to content

Commit

Permalink
Merge branch 'master' into 9.5-dev
Browse files Browse the repository at this point in the history
  • Loading branch information
headius committed Apr 25, 2024
2 parents 4cdf181 + 8ceb1c7 commit 9e805d5
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ public static class StaticJCreateMethod extends JavaMethodNBlock {
StaticJCreateMethod(RubyModule implClass, Constructor<? extends ReifiedJavaProxy> javaProxyConstructor, DynamicMethod oldinit) {
super(implClass, PUBLIC, "__jcreate_static!");
this.withBlock = javaProxyConstructor;
this.oldInit = oldinit;
this.oldInit = oldinit == null ? oldinit : oldinit.getRealMethod(); // ensure we don't use a wrapper (jruby/jruby#8148)
}

@Override
Expand Down Expand Up @@ -375,7 +375,7 @@ public SplitCtorData splitInitialized(RubyClass base, IRubyObject[] args, Block
final String name = base.getClassConfig().javaCtorMethodName;
final CacheEntry methodEntry = base.searchWithCache(name);
final boolean isLateral = isClassOrIncludedPrependedModule(methodEntry.sourceModule, base);
DynamicMethod method = methodEntry.method;
DynamicMethod method = methodEntry.method.getRealMethod(); // ensure we don't use a wrapper (jruby/jruby#8148)
if (method instanceof StaticJCreateMethod) method = ((StaticJCreateMethod) method).oldInit;

// jcreate is for nested ruby classes from a java class
Expand Down
18 changes: 8 additions & 10 deletions core/src/main/java/org/jruby/javasupport/Java.java
Original file line number Diff line number Diff line change
Expand Up @@ -411,9 +411,14 @@ public static RubyModule getProxyClass(Ruby runtime, JavaClass javaClass) {

@SuppressWarnings("deprecation")
public static RubyModule getProxyClass(final Ruby runtime, final Class<?> clazz) {
return getProxyClass(runtime, clazz, Options.JI_EAGER_CONSTANTS.load());
}

@SuppressWarnings("deprecation")
public static RubyModule getProxyClass(final Ruby runtime, final Class<?> clazz, boolean setConstant) {
RubyModule proxy = runtime.getJavaSupport().getUnfinishedProxy(clazz);
if (proxy != null) return proxy;
return runtime.getJavaSupport().getProxyClassFromCache(clazz);
return runtime.getJavaSupport().getProxyClassFromCache(clazz, setConstant);
}

// expected to handle Java proxy (Ruby) sub-classes as well
Expand Down Expand Up @@ -470,7 +475,6 @@ private static void generateInterfaceProxy(final Ruby runtime, final Class javaC
proxy.includeModule(extModule);
}
Initializer.setupProxyModule(runtime, javaClass, proxy);
addToJavaPackageModule(proxy);
}

private static void generateClassProxy(Ruby runtime, Class<?> clazz, RubyClass proxy, RubyClass superClass) {
Expand All @@ -492,7 +496,6 @@ else if ( clazz == Object.class ) {
} else {
proxy.getMetaClass().defineAnnotatedMethods(OldStyleExtensionInherited.class);
}
addToJavaPackageModule(proxy);
}
else {
createProxyClass(runtime, proxy, clazz, superClass, false);
Expand All @@ -501,9 +504,6 @@ else if ( clazz == Object.class ) {
for ( int i = interfaces.length; --i >= 0; ) {
proxy.includeModule(getInterfaceModule(runtime, interfaces[i]));
}
if ( Modifier.isPublic(clazz.getModifiers()) ) {
addToJavaPackageModule(proxy);
}
}

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

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

Expand Down Expand Up @@ -1070,7 +1068,7 @@ private static RubyModule getProxyClassOrNull(final Ruby runtime, final String c
} catch (ClassNotFoundException ex) { // used to catch NoClassDefFoundError for whatever reason
return null;
}
return getProxyClass(runtime, clazz);
return getProxyClass(runtime, clazz, true);
}

private static int mapMajorMinorClassVersionToJavaVersion(String msg, final int offset) {
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/javasupport/JavaPackage.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private RubyModule relativeJavaClassOrPackage(final ThreadContext context,

RubyModule relativeJavaProxyClass(final Ruby runtime, final IRubyObject name) {
final String fullName = packageRelativeName( name.toString() ).toString();
return Java.getProxyClass(runtime, Java.getJavaClass(runtime, fullName));
return Java.getProxyClass(runtime, Java.getJavaClass(runtime, fullName), true);
}

@JRubyMethod(name = "respond_to?")
Expand Down
13 changes: 11 additions & 2 deletions core/src/main/java/org/jruby/javasupport/JavaSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.jruby.util.collections.ClassValueCalculator;

import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -369,8 +370,16 @@ final RubyModule getUnfinishedProxy(Class clazz) {
return null;
}

RubyModule getProxyClassFromCache(Class clazz) {
return proxyClassCache.get(clazz);
RubyModule getProxyClassFromCache(Class clazz, boolean setConstant) {
RubyModule proxy = proxyClassCache.get(clazz);

if (setConstant) {
if ( Modifier.isPublic(clazz.getModifiers()) ) {
Java.addToJavaPackageModule(runtime, clazz, proxy);
}
}

return proxy;
}

}
1 change: 1 addition & 0 deletions core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ public class Options {
public static final Option<Boolean> JI_LOAD_LAZY = bool(JAVA_INTEGRATION, "ji.load.lazy", true, "Load Java support (class extensions) lazily on demand or ahead of time.");
public static final Option<Boolean> JI_CLOSE_CLASSLOADER = bool(JAVA_INTEGRATION, "ji.close.classloader", false, "Close the JRubyClassLoader used by each runtime");
public static final Option<String> JI_NESTED_JAR_TMPDIR = string(JAVA_INTEGRATION, "ji.nested.jar.tmpdir", "Use specified dir as a base for unpacking nested jar files.");
public static final Option<Boolean> JI_EAGER_CONSTANTS = bool(JAVA_INTEGRATION, "ji.eager.constants", true, "Eagerly bind Java:: constants for newly-encountered classes");

public static final Option<Integer> PROFILE_MAX_METHODS = integer(PROFILING, "profile.max.methods", 100000, "Maximum number of methods to consider for profiling.");

Expand Down

0 comments on commit 9e805d5

Please sign in to comment.