Skip to content

Commit 4ebb6ce

Browse files
committed
typeReached for proxies
1 parent 881c683 commit 4ebb6ce

File tree

7 files changed

+46
-32
lines changed

7 files changed

+46
-32
lines changed

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -43,6 +43,7 @@
4343
import org.graalvm.nativeimage.ImageSingletons;
4444
import org.graalvm.nativeimage.Platform;
4545
import org.graalvm.nativeimage.Platforms;
46+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
4647
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
4748

4849
/**
@@ -61,7 +62,7 @@ public final class RuntimeProxyCreation {
6162
* @since 22.3
6263
*/
6364
public static void register(Class<?>... interfaces) {
64-
ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(interfaces);
65+
ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces);
6566
}
6667

6768
private RuntimeProxyCreation() {

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -41,5 +41,5 @@
4141
package org.graalvm.nativeimage.impl;
4242

4343
public interface RuntimeProxyCreationSupport {
44-
void addProxyClass(Class<?>... interfaces);
44+
void addProxyClass(ConfigurationCondition condition, Class<?>... interfaces);
4545
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ConfigurationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ protected UnresolvedConfigurationCondition parseCondition(EconomicMap<String, Ob
231231
var condition = parseTypeContents(object);
232232
if (condition.isPresent()) {
233233
String className = ((NamedConfigurationTypeDescriptor) condition.get()).name();
234-
return UnresolvedConfigurationCondition.create(className, false);
234+
return UnresolvedConfigurationCondition.create(className, TreatAllTypeReachableConditionsAsTypeReached.getValue());
235235
}
236236
}
237237
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,16 @@
3434
import org.graalvm.nativeimage.Platforms;
3535
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
3636
import org.graalvm.nativeimage.hosted.RuntimeReflection;
37+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3738

39+
import com.oracle.svm.core.configure.ConditionalRuntimeValue;
40+
import com.oracle.svm.core.configure.RuntimeConditionSet;
3841
import com.oracle.svm.core.hub.DynamicHub;
3942
import com.oracle.svm.core.hub.PredefinedClassesSupport;
4043
import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry;
4144
import com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils;
4245
import com.oracle.svm.core.util.ImageHeapMap;
46+
import com.oracle.svm.core.util.VMError;
4347
import com.oracle.svm.util.ClassUtil;
4448
import com.oracle.svm.util.LogUtils;
4549
import com.oracle.svm.util.ReflectionUtil;
@@ -78,15 +82,16 @@ public String toString() {
7882
}
7983
}
8084

81-
private final EconomicMap<ProxyCacheKey, Object> proxyCache = ImageHeapMap.create();
85+
private final EconomicMap<ProxyCacheKey, ConditionalRuntimeValue<Object>> proxyCache = ImageHeapMap.create();
8286

8387
@Platforms(Platform.HOSTED_ONLY.class)
8488
public DynamicProxySupport() {
8589
}
8690

8791
@Override
8892
@Platforms(Platform.HOSTED_ONLY.class)
89-
public synchronized void addProxyClass(Class<?>... interfaces) {
93+
public synchronized void addProxyClass(ConfigurationCondition condition, Class<?>... interfaces) {
94+
VMError.guarantee(condition.isRuntimeChecked(), "The condition used must be a runtime condition.");
9095
/*
9196
* Make a defensive copy of the interfaces array to protect against the caller modifying the
9297
* array.
@@ -95,8 +100,9 @@ public synchronized void addProxyClass(Class<?>... interfaces) {
95100
ProxyCacheKey key = new ProxyCacheKey(intfs);
96101

97102
if (!proxyCache.containsKey(key)) {
98-
proxyCache.put(key, createProxyClass(intfs));
103+
proxyCache.put(key, new ConditionalRuntimeValue<>(RuntimeConditionSet.createHosted(), createProxyClass(intfs)));
99104
}
105+
proxyCache.get(key).getConditions().addCondition(condition);
100106
}
101107

102108
@Platforms(Platform.HOSTED_ONLY.class)
@@ -168,14 +174,15 @@ private static ClassLoader getCommonClassLoaderOrFail(ClassLoader loader, Class<
168174
@Override
169175
public Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) {
170176
ProxyCacheKey key = new ProxyCacheKey(interfaces);
171-
Object clazzOrError = proxyCache.get(key);
172-
if (clazzOrError == null) {
177+
ConditionalRuntimeValue<Object> clazzOrError = proxyCache.get(key);
178+
179+
if (clazzOrError == null || !clazzOrError.getConditions().satisfied()) {
173180
throw MissingReflectionRegistrationUtils.errorForProxy(interfaces);
174181
}
175-
if (clazzOrError instanceof Throwable) {
176-
throw new GraalError((Throwable) clazzOrError);
182+
if (clazzOrError.getValue() instanceof Throwable) {
183+
throw new GraalError((Throwable) clazzOrError.getValue());
177184
}
178-
Class<?> clazz = (Class<?>) clazzOrError;
185+
Class<?> clazz = (Class<?>) clazzOrError.getValue();
179186
if (!DynamicHub.fromClass(clazz).isLoaded()) {
180187
/*
181188
* NOTE: we might race with another thread in loading this proxy class.

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry;
3939
import com.oracle.svm.core.jni.JNIRuntimeAccess;
4040
import com.oracle.svm.util.ReflectionUtil;
41+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
4142

4243
@AutomaticallyRegisteredFeature
4344
public class JmxCommonFeature implements InternalFeature {
@@ -157,22 +158,27 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
157158
*/
158159
private static void configureProxy(BeforeAnalysisAccess access) {
159160
DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class);
160-
dynamicProxySupport.addProxyClass(access.findClassByName("com.sun.management.GarbageCollectorMXBean"), access.findClassByName("javax.management.NotificationEmitter"));
161-
dynamicProxySupport.addProxyClass(access.findClassByName("com.sun.management.OperatingSystemMXBean"));
162-
dynamicProxySupport.addProxyClass(access.findClassByName("com.sun.management.ThreadMXBean"));
163-
dynamicProxySupport.addProxyClass(access.findClassByName("com.sun.management.UnixOperatingSystemMXBean"));
164-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.BufferPoolMXBean"));
165-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.ClassLoadingMXBean"));
166-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.CompilationMXBean"));
167-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.GarbageCollectorMXBean"), access.findClassByName("javax.management.NotificationEmitter"));
168-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.MemoryManagerMXBean"), access.findClassByName("javax.management.NotificationEmitter"));
169-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.MemoryManagerMXBean"));
170-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.MemoryPoolMXBean"), access.findClassByName("javax.management.NotificationEmitter"));
171-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.MemoryMXBean"), access.findClassByName("javax.management.NotificationEmitter"));
172-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.OperatingSystemMXBean"));
173-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.RuntimeMXBean"));
174-
dynamicProxySupport.addProxyClass(access.findClassByName("java.lang.management.ThreadMXBean"));
175-
dynamicProxySupport.addProxyClass(access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"),
161+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.GarbageCollectorMXBean"),
162+
access.findClassByName("javax.management.NotificationEmitter"));
163+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.OperatingSystemMXBean"));
164+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.ThreadMXBean"));
165+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.UnixOperatingSystemMXBean"));
166+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.BufferPoolMXBean"));
167+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ClassLoadingMXBean"));
168+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.CompilationMXBean"));
169+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.GarbageCollectorMXBean"),
170+
access.findClassByName("javax.management.NotificationEmitter"));
171+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"),
172+
access.findClassByName("javax.management.NotificationEmitter"));
173+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"));
174+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryPoolMXBean"),
175+
access.findClassByName("javax.management.NotificationEmitter"));
176+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryMXBean"),
177+
access.findClassByName("javax.management.NotificationEmitter"));
178+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.OperatingSystemMXBean"));
179+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.RuntimeMXBean"));
180+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ThreadMXBean"));
181+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"),
176182
access.findClassByName("javax.management.NotificationEmitter"));
177183
}
178184

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ private static void registerJMXAgentResources() {
8989
private static void configureProxy(BeforeAnalysisAccess access) {
9090
DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class);
9191

92-
dynamicProxySupport.addProxyClass(access.findClassByName("java.rmi.Remote"),
92+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.rmi.Remote"),
9393
access.findClassByName("java.rmi.registry.Registry"));
9494

95-
dynamicProxySupport.addProxyClass(access.findClassByName("javax.management.remote.rmi.RMIServer"));
95+
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("javax.management.remote.rmi.RMIServer"));
9696
}
9797

9898
/**

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void accept(ConfigurationCondition condition, List<String> proxies) {
4949
if (interfaces != null) {
5050
registerConditionalConfiguration(condition, (cnd) -> {
5151
/* The interfaces array can be empty. The java.lang.reflect.Proxy API allows it. */
52-
dynamicProxySupport.addProxyClass(interfaces);
52+
dynamicProxySupport.addProxyClass(cnd, interfaces);
5353
});
5454
}
5555
}

0 commit comments

Comments
 (0)