Skip to content

Commit f3607e9

Browse files
author
mihailo
committed
Changed typeReachable conditions in typeReached in all places in codebase where it does not affect semantics. Conditions can't be registered during analysis anymore, except alwaysTrue conditions. Removed methods from MetadataCondition API to implementation.
1 parent e68551a commit f3607e9

File tree

8 files changed

+28
-35
lines changed

8 files changed

+28
-35
lines changed

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,4 @@ static MetadataCondition create(Class<?> type) {
6262

6363
boolean isAlwaysTrue();
6464

65-
/**
66-
* GR-62516, this should be deleted.
67-
*/
68-
default boolean isRuntimeChecked() {
69-
TypeReachedCondition typeReachedCondition = (TypeReachedCondition) this;
70-
return typeReachedCondition.runtimeChecked;
71-
}
72-
73-
Class<?> getKey();
7465
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public class TypeReachedCondition implements MetadataCondition {
7171
* @param runtimeChecked makes this a type-reachable condition when false
7272
* @return instance of the condition
7373
*/
74+
7475
public static TypeReachedCondition create(Class<?> type, boolean runtimeChecked) {
7576
Objects.requireNonNull(type);
7677
if (MetadataCondition.JAVA_LANG_OBJECT_REACHED.getKey().equals(type)) {
@@ -84,12 +85,11 @@ public boolean isAlwaysTrue() {
8485
return MetadataCondition.alwaysTrue().equals(this);
8586
}
8687

87-
public TypeReachedCondition(Class<?> type, boolean runtimeChecked) {
88+
TypeReachedCondition(Class<?> type, boolean runtimeChecked) {
8889
this.runtimeChecked = runtimeChecked;
8990
this.type = type;
9091
}
9192

92-
@Override
9393
public Class<?> getKey() {
9494
return type;
9595
}
@@ -118,4 +118,8 @@ public String toString() {
118118
", runtimeChecked=" + runtimeChecked +
119119
')';
120120
}
121+
122+
public boolean isRuntimeChecked() {
123+
return runtimeChecked;
124+
}
121125
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.graalvm.nativeimage.Platform;
3535
import org.graalvm.nativeimage.Platforms;
3636
import org.graalvm.nativeimage.impl.MetadataCondition;
37+
import org.graalvm.nativeimage.impl.TypeReachedCondition;
3738

3839
import com.oracle.svm.core.hub.DynamicHub;
3940
import com.oracle.svm.core.util.VMError;
@@ -68,7 +69,7 @@ public static RuntimeConditionSet createHosted(MetadataCondition condition) {
6869

6970
@Platforms(Platform.HOSTED_ONLY.class)
7071
public synchronized void addCondition(MetadataCondition cnd) {
71-
VMError.guarantee(cnd.isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
72+
VMError.guarantee(((TypeReachedCondition) cnd).isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
7273
if (satisfied) {
7374
return;
7475
} else if (cnd.isAlwaysTrue()) {
@@ -160,10 +161,10 @@ private void setConditions(Object[] conditions) {
160161
}
161162

162163
private static Object createRuntimeCondition(MetadataCondition cnd) {
163-
if (cnd.isAlwaysTrue() || !cnd.isRuntimeChecked()) {
164+
if (cnd.isAlwaysTrue() || !((TypeReachedCondition) cnd).isRuntimeChecked()) {
164165
throw VMError.shouldNotReachHere("We should never create run-time conditions from conditions that are always true at build time. Condition: " + cnd);
165166
}
166-
return cnd.getKey();
167+
return ((TypeReachedCondition) cnd).getKey();
167168
}
168169

169170
private static boolean isSatisfied(Object condition) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
3636
import org.graalvm.nativeimage.hosted.RuntimeReflection;
3737
import org.graalvm.nativeimage.impl.MetadataCondition;
38+
import org.graalvm.nativeimage.impl.TypeReachedCondition;
3839

3940
import com.oracle.svm.core.configure.ConditionalRuntimeValue;
4041
import com.oracle.svm.core.configure.RuntimeConditionSet;
@@ -102,7 +103,7 @@ public DynamicProxySupport() {
102103
@Override
103104
@Platforms(Platform.HOSTED_ONLY.class)
104105
public synchronized void addProxyClass(MetadataCondition condition, Class<?>... interfaces) {
105-
VMError.guarantee(condition.isRuntimeChecked(), "The condition used must be a runtime condition.");
106+
VMError.guarantee(((TypeReachedCondition) condition).isRuntimeChecked(), "The condition used must be a runtime condition.");
106107
/*
107108
* Make a defensive copy of the interfaces array to protect against the caller modifying the
108109
* array.

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import org.graalvm.nativeimage.hosted.Feature;
3535
import org.graalvm.nativeimage.impl.MetadataCondition;
36+
import org.graalvm.nativeimage.impl.TypeReachedCondition;
3637

3738
import com.oracle.svm.core.util.VMError;
3839
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
@@ -44,29 +45,29 @@ public abstract class ConditionalConfigurationRegistry {
4445
protected void registerConditionalConfiguration(MetadataCondition condition, Consumer<MetadataCondition> consumer) {
4546
Objects.requireNonNull(condition, "Cannot use null value as condition for conditional configuration. Please ensure that you register a non-null condition.");
4647
Objects.requireNonNull(consumer, "Cannot use null value as runnable for conditional configuration. Please ensure that you register a non-null runnable.");
47-
if (condition.isRuntimeChecked() && !condition.isAlwaysTrue()) {
48+
if (((TypeReachedCondition) condition).isRuntimeChecked() && !condition.isAlwaysTrue()) {
4849
/*
4950
* We do this before the type is reached as the handler runs during analysis when it is
5051
* too late to register types for reached tracking. If the type is never reached, there
5152
* is no damage as subtypes will also never be reached.
5253
*/
53-
ClassInitializationSupport.singleton().addForTypeReachedTracking(condition.getKey());
54+
ClassInitializationSupport.singleton().addForTypeReachedTracking(((TypeReachedCondition) condition).getKey());
5455
}
5556
if (MetadataCondition.alwaysTrue().equals(condition)) {
5657
/* analysis optimization to include new types as early as possible */
5758
consumer.accept(MetadataCondition.alwaysTrue());
5859
} else {
5960
MetadataCondition runtimeCondition;
60-
if (condition.isRuntimeChecked()) {
61+
if (((TypeReachedCondition) condition).isRuntimeChecked()) {
6162
runtimeCondition = condition;
6263
} else {
6364
runtimeCondition = MetadataCondition.alwaysTrue();
6465
}
6566
if (beforeAnalysisAccess == null) {
66-
Collection<Runnable> handlers = pendingReachabilityHandlers.computeIfAbsent(condition.getKey(), key -> new ConcurrentLinkedQueue<>());
67+
Collection<Runnable> handlers = pendingReachabilityHandlers.computeIfAbsent(((TypeReachedCondition) condition).getKey(), key -> new ConcurrentLinkedQueue<>());
6768
handlers.add(() -> consumer.accept(runtimeCondition));
6869
} else {
69-
beforeAnalysisAccess.registerReachabilityHandler(access -> consumer.accept(runtimeCondition), condition.getKey());
70+
beforeAnalysisAccess.registerReachabilityHandler(access -> consumer.accept(runtimeCondition), ((TypeReachedCondition) condition).getKey());
7071
}
7172

7273
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
6060
import org.graalvm.nativeimage.impl.MetadataCondition;
6161
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
62+
import org.graalvm.nativeimage.impl.TypeReachedCondition;
6263

6364
import com.oracle.svm.configure.ConfigurationFile;
6465
import com.oracle.svm.configure.ResourceConfigurationParser;
@@ -202,7 +203,7 @@ public void addGlob(MetadataCondition condition, String module, String glob, Obj
202203
public void addCondition(MetadataCondition condition, Module module, String resourcePath) {
203204
var conditionalResource = Resources.currentLayer().getResource(createStorageKey(module, resourcePath));
204205
if (conditionalResource != null) {
205-
classInitializationSupport.addForTypeReachedTracking(condition.getKey());
206+
classInitializationSupport.addForTypeReachedTracking(((TypeReachedCondition) condition).getKey());
206207
conditionalResource.getConditions().addCondition(condition);
207208
}
208209
}
@@ -655,7 +656,7 @@ public void afterAnalysis(AfterAnalysisAccess access) {
655656

656657
/* prepare resources GlobTrie for runtime */
657658
GlobTrieNode<ConditionWithOrigin> root = Resources.currentLayer().getResourcesTrieRoot();
658-
CompressedGlobTrie.removeNodes(root, (conditionWithOrigin) -> !access.isReachable(conditionWithOrigin.condition().getKey()));
659+
CompressedGlobTrie.removeNodes(root, (conditionWithOrigin) -> !access.isReachable(((TypeReachedCondition) conditionWithOrigin.condition()).getKey()));
659660
CompressedGlobTrie.finalize(root);
660661
}
661662

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ public TypeResult<MetadataCondition> resolveCondition(UnresolvedConfigurationCon
5353
* reachability checks.
5454
*/
5555
var runtimeChecked = !classInitializationSupport.isAlwaysReached(type) && unresolvedCondition.isRuntimeChecked();
56-
/*
57-
* GR-62516, this should be deleted
58-
*/
5956
return TypeReachedCondition.create(type, runtimeChecked);
6057
});
6158
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
import org.graalvm.nativeimage.hosted.RuntimeProxyCreation;
7272
import org.graalvm.nativeimage.hosted.RuntimeReflection;
7373
import org.graalvm.nativeimage.impl.MetadataCondition;
74-
import org.graalvm.nativeimage.impl.TypeReachedCondition;
7574
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
75+
import org.graalvm.nativeimage.impl.TypeReachedCondition;
7676

7777
import com.oracle.graal.pointsto.ObjectScanner.ScanReason;
7878
import com.oracle.graal.pointsto.constraints.UnsupportedFeatureException;
@@ -96,13 +96,13 @@
9696
import com.oracle.svm.hosted.annotation.AnnotationValue;
9797
import com.oracle.svm.hosted.annotation.SubstrateAnnotationExtractor;
9898
import com.oracle.svm.hosted.annotation.TypeAnnotationValue;
99+
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
99100
import com.oracle.svm.hosted.substitute.SubstitutionReflectivityFilter;
100101
import com.oracle.svm.util.LogUtils;
101102
import com.oracle.svm.util.ReflectionUtil;
102103

103104
import jdk.vm.ci.meta.ResolvedJavaField;
104105
import jdk.vm.ci.meta.ResolvedJavaMethod;
105-
106106
import sun.reflect.annotation.ExceptionProxy;
107107

108108
public class ReflectionDataBuilder extends ConditionalConfigurationRegistry implements RuntimeReflectionSupport, ReflectionHostedSupport {
@@ -180,8 +180,8 @@ public void beforeAnalysis(BeforeAnalysisAccessImpl beforeAnalysisAccess) {
180180
}
181181

182182
private void runConditionalInAnalysisTask(MetadataCondition condition, Consumer<MetadataCondition> task) {
183-
if (sealed) {
184-
throw new UnsupportedFeatureException("Too late to add classes, methods, and fields for reflective access. Registration must happen in a Feature before the analysis has finished.");
183+
if (sealed || (ClassInitializationSupport.singleton().getConfigurationSealed() && !condition.isAlwaysTrue())) {
184+
throw new UnsupportedFeatureException("Too late to add classes, methods, and fields for reflective access. Registration must happen in a Feature before the analysis has started.");
185185
}
186186

187187
if (universe != null) {
@@ -231,7 +231,8 @@ public void registerAllClassesQuery(MetadataCondition condition, Class<?> clazz)
231231
@SuppressWarnings("unused")
232232
private static void guaranteeNotRuntimeConditionForQueries(MetadataCondition cnd, boolean queriedOnly) {
233233
if (!TreatAllTypeReachableConditionsAsTypeReached.getValue()) {
234-
VMError.guarantee(!queriedOnly || cnd.isAlwaysTrue() || !cnd.isRuntimeChecked(), "Bulk queries can only be set with 'name' which does not allow run-time conditions.");
234+
VMError.guarantee(!queriedOnly || cnd.isAlwaysTrue() || !((TypeReachedCondition) cnd).isRuntimeChecked(),
235+
"Bulk queries can only be set with 'name' which does not allow run-time conditions.");
235236
}
236237
}
237238

@@ -650,11 +651,7 @@ private void processAnnotationMethod(boolean queriedOnly, Method method) {
650651
Class<?> annotationClass = method.getDeclaringClass();
651652
Class<?> proxyClass = Proxy.getProxyClass(annotationClass.getClassLoader(), annotationClass);
652653
try {
653-
/*
654-
* build-time condition as it is registered during analysis GR-62516, this should be
655-
* deleted
656-
*/
657-
var condition = TypeReachedCondition.create(proxyClass, false);
654+
var condition = MetadataCondition.alwaysTrue();
658655
register(condition, queriedOnly, proxyClass.getDeclaredMethod(method.getName(), method.getParameterTypes()));
659656
} catch (NoSuchMethodException e) {
660657
/*

0 commit comments

Comments
 (0)