diff --git a/sdk/src/org.graalvm.nativeimage/snapshot.sigtest b/sdk/src/org.graalvm.nativeimage/snapshot.sigtest
index 5c15c4d96208..f5c3c2647728 100644
--- a/sdk/src/org.graalvm.nativeimage/snapshot.sigtest
+++ b/sdk/src/org.graalvm.nativeimage/snapshot.sigtest
@@ -1082,6 +1082,10 @@ CLSS public abstract interface org.graalvm.nativeimage.hosted.FieldValueTransfor
meth public abstract java.lang.Object transform(java.lang.Object,java.lang.Object)
meth public boolean isAvailable()
+CLSS public abstract interface org.graalvm.nativeimage.hosted.RegistrationCondition
+meth public static org.graalvm.nativeimage.hosted.RegistrationCondition alwaysInclude()
+meth public static org.graalvm.nativeimage.hosted.RegistrationCondition typeReached(java.lang.Class>)
+
CLSS public final org.graalvm.nativeimage.hosted.RuntimeClassInitialization
meth public !varargs static void initializeAtBuildTime(java.lang.Class>[])
meth public !varargs static void initializeAtBuildTime(java.lang.String[])
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java
new file mode 100644
index 000000000000..80c90c2f270d
--- /dev/null
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * The Universal Permissive License (UPL), Version 1.0
+ *
+ * Subject to the condition set forth below, permission is hereby granted to any
+ * person obtaining a copy of this software, associated documentation and/or
+ * data (collectively the "Software"), free of charge and under any and all
+ * copyright rights in the Software, and any and all patent rights owned or
+ * freely licensable by each licensor hereunder covering either (i) the
+ * unmodified Software as contributed to or provided by such licensor, or (ii)
+ * the Larger Works (as defined below), to deal in both
+ *
+ * (a) the Software, and
+ *
+ * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+ * one is included with the Software each a "Larger Work" to which the Software
+ * is contributed by such licensors),
+ *
+ * without restriction, including without limitation the rights to copy, create
+ * derivative works of, display, perform, and distribute the Software and make,
+ * use, sell, offer for sale, import, export, have made, and have sold the
+ * Software and the Larger Work(s), and to sublicense the foregoing rights on
+ * either these or other terms.
+ *
+ * This license is subject to the following condition:
+ *
+ * The above copyright notice and either this complete permission notice or at a
+ * minimum a reference to the UPL must be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package org.graalvm.nativeimage.hosted;
+
+import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
+
+/**
+ * Condition that must be satisfied for inclusion of elements for dynamic access (e.g., runtime
+ * reflection, serialization, JNI access, and resource access at runtime).
+ * {@link RegistrationCondition} is used together with {@link Feature} for programmatic registration
+ * of metadata.
+ *
+ * Currently, there are two types of conditions:
+ *
+ *
{@link #typeReached} which signifies that the type must be both reachable by static analysis
+ * at build time, and reached at run time.
+ *
{@link #always} is a condition that is always satisfied.
+ *
+ *
+ *
+ * Conditions can be created via the {@link #always} and {@link #typeReached} factory methods.
+ */
+public interface RegistrationCondition {
+
+ /**
+ * Creates the condition that is always satisfied. Any element that is predicated with this
+ * condition will always be included.
+ *
+ * @return instance of the condition
+ */
+ static RegistrationCondition always() {
+ return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
+ }
+
+ /**
+ * Creates the {@code typeReached} condition, that is satisfied when the type is reached at
+ * runtime. A type is reached at run time, right before the class-initialization routine starts
+ * for that type, or any of the type's subtypes are reached.
+ *
+ * @param type that has to be reached for this condition to be satisfied
+ * @return instance of the condition
+ */
+ static RegistrationCondition typeReached(Class> type) {
+ return TypeReachabilityCondition.create(type, true);
+ }
+}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
index 2b5aa887f6ce..887773256695 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -46,7 +46,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport;
@Platforms(Platform.HOSTED_ONLY.class)
@@ -68,7 +67,7 @@ public final class RuntimeForeignAccess {
* @since 23.1
*/
public static void registerForDowncall(Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(ConfigurationCondition.alwaysTrue(), desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(RegistrationCondition.always(), desc, options);
}
/**
@@ -86,7 +85,7 @@ public static void registerForDowncall(Object desc, Object... options) {
* @since 24.1
*/
public static void registerForUpcall(Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(ConfigurationCondition.alwaysTrue(), desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(RegistrationCondition.always(), desc, options);
}
/**
@@ -114,7 +113,7 @@ public static void registerForUpcall(Object desc, Object... options) {
* @since 24.2
*/
public static void registerForDirectUpcall(MethodHandle target, Object desc, Object... options) {
- ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(ConfigurationCondition.alwaysTrue(), target, desc, options);
+ ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(RegistrationCondition.always(), target, desc, options);
}
private RuntimeForeignAccess() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
index e5c044517406..39043285e069 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -46,7 +46,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
/**
@@ -66,7 +65,7 @@ public final class RuntimeJNIAccess {
* @since 22.3
*/
public static void register(Class>... classes) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), classes);
}
/**
@@ -79,7 +78,7 @@ public static void register(Class>... classes) {
* @since 22.3
*/
public static void register(Executable... methods) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, methods);
}
/**
@@ -92,7 +91,7 @@ public static void register(Executable... methods) {
* @since 22.3
*/
public static void register(Field... fields) {
- ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
+ ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, fields);
}
private RuntimeJNIAccess() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
index a2f4f7bb781e..dfc9c678d8b3 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -43,7 +43,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
/**
@@ -62,7 +61,7 @@ public final class RuntimeProxyCreation {
* @since 22.3
*/
public static void register(Class>... interfaces) {
- ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces);
+ ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(RegistrationCondition.always(), interfaces);
}
private RuntimeProxyCreation() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
index a4b5adb949f3..641ce3af1287 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java
@@ -48,7 +48,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
//Checkstyle: allow reflection
@@ -69,7 +68,7 @@ public final class RuntimeReflection {
* @since 19.0
*/
public static void register(Class>... classes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), classes);
}
/**
@@ -80,7 +79,7 @@ public static void register(Class>... classes) {
* @since 23.0
*/
public static void registerClassLookup(String className) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(ConfigurationCondition.alwaysTrue(), className);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(RegistrationCondition.always(), className);
}
/**
@@ -91,7 +90,7 @@ public static void registerClassLookup(String className) {
* @since 19.0
*/
public static void register(Executable... methods) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), false, methods);
}
/**
@@ -103,7 +102,7 @@ public static void register(Executable... methods) {
* @since 21.3
*/
public static void registerAsQueried(Executable... methods) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), true, methods);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), true, methods);
}
/**
@@ -116,7 +115,7 @@ public static void registerAsQueried(Executable... methods) {
* @since 23.0
*/
public static void registerMethodLookup(Class> declaringClass, String methodName, Class>... parameterTypes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(ConfigurationCondition.alwaysTrue(), declaringClass, methodName, parameterTypes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(RegistrationCondition.always(), declaringClass, methodName, parameterTypes);
}
/**
@@ -130,7 +129,7 @@ public static void registerMethodLookup(Class> declaringClass, String methodNa
* @since 23.0
*/
public static void registerConstructorLookup(Class> declaringClass, Class>... parameterTypes) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(ConfigurationCondition.alwaysTrue(), declaringClass, parameterTypes);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(RegistrationCondition.always(), declaringClass, parameterTypes);
}
/**
@@ -141,7 +140,7 @@ public static void registerConstructorLookup(Class> declaringClass, Class>..
* @since 19.0
*/
public static void register(Field... fields) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), false, fields);
}
/**
@@ -153,7 +152,7 @@ public static void register(Field... fields) {
* @since 19.0
*/
public static void registerFieldLookup(Class> declaringClass, String fieldName) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(ConfigurationCondition.alwaysTrue(), declaringClass, fieldName);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(RegistrationCondition.always(), declaringClass, fieldName);
}
/**
@@ -162,7 +161,7 @@ public static void registerFieldLookup(Class> declaringClass, String fieldName
* @since 23.0
*/
public static void registerAllClasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(RegistrationCondition.always(), declaringClass);
}
/**
@@ -171,7 +170,7 @@ public static void registerAllClasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredClasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(RegistrationCondition.always(), declaringClass);
}
/**
@@ -181,7 +180,7 @@ public static void registerAllDeclaredClasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllMethods(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(RegistrationCondition.always(), true, declaringClass);
}
/**
@@ -191,7 +190,7 @@ public static void registerAllMethods(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredMethods(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(RegistrationCondition.always(), true, declaringClass);
}
/**
@@ -201,7 +200,7 @@ public static void registerAllDeclaredMethods(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllConstructors(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(RegistrationCondition.always(), true, declaringClass);
}
/**
@@ -211,7 +210,7 @@ public static void registerAllConstructors(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredConstructors(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(RegistrationCondition.always(), true, declaringClass);
}
/**
@@ -221,7 +220,7 @@ public static void registerAllDeclaredConstructors(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllFields(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(RegistrationCondition.always(), declaringClass);
}
/**
@@ -231,7 +230,7 @@ public static void registerAllFields(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllDeclaredFields(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(RegistrationCondition.always(), declaringClass);
}
/**
@@ -240,7 +239,7 @@ public static void registerAllDeclaredFields(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllNestMembers(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(RegistrationCondition.always(), declaringClass);
}
/**
@@ -249,7 +248,7 @@ public static void registerAllNestMembers(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllPermittedSubclasses(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(RegistrationCondition.always(), declaringClass);
}
/**
@@ -258,7 +257,7 @@ public static void registerAllPermittedSubclasses(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllRecordComponents(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(RegistrationCondition.always(), declaringClass);
}
/**
@@ -267,7 +266,7 @@ public static void registerAllRecordComponents(Class> declaringClass) {
* @since 23.0
*/
public static void registerAllSigners(Class> declaringClass) {
- ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(ConfigurationCondition.alwaysTrue(), declaringClass);
+ ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(RegistrationCondition.always(), declaringClass);
}
/**
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
index 6d7b6cd60398..bc7f30a5962d 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -47,7 +47,6 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
/**
@@ -84,7 +83,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour
Objects.requireNonNull(resourcePath);
Objects.requireNonNull(resourceContent);
ImageSingletons.lookup(RuntimeResourceSupport.class).injectResource(module, resourcePath, resourceContent, "Manually added via RuntimeResourceAccess");
- ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(ConfigurationCondition.alwaysTrue(), module, resourcePath);
+ ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(RegistrationCondition.always(), module, resourcePath);
}
/**
@@ -96,7 +95,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour
*/
public static void addResourceBundle(Module module, String baseBundleName, Locale[] locales) {
Objects.requireNonNull(locales);
- RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(),
+ RuntimeResourceSupport.singleton().addResourceBundles(RegistrationCondition.always(),
withModuleName(module, baseBundleName), Arrays.asList(locales));
}
@@ -108,7 +107,7 @@ public static void addResourceBundle(Module module, String baseBundleName, Local
* @since 22.3
*/
public static void addResourceBundle(Module module, String bundleName) {
- RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(),
+ RuntimeResourceSupport.singleton().addResourceBundles(RegistrationCondition.always(),
withModuleName(module, bundleName));
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
index 8de8de2ea716..4c5700dde8cf 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,7 +42,6 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
/**
@@ -72,7 +71,7 @@ public final class RuntimeSerialization {
* @since 21.3
*/
public static void registerIncludingAssociatedClasses(Class> clazz) {
- RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(RegistrationCondition.always(), clazz);
}
/**
@@ -82,7 +81,7 @@ public static void registerIncludingAssociatedClasses(Class> clazz) {
*/
public static void register(Class>... classes) {
for (Class> clazz : classes) {
- RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().register(RegistrationCondition.always(), clazz);
}
}
@@ -103,7 +102,7 @@ public static void register(Class>... classes) {
@Deprecated(since = "24.2")
@SuppressWarnings("unused")
public static void registerWithTargetConstructorClass(Class> clazz, Class> customTargetConstructorClazz) {
- RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz);
+ RuntimeSerializationSupport.singleton().register(RegistrationCondition.always(), clazz);
}
/**
@@ -114,7 +113,7 @@ public static void registerWithTargetConstructorClass(Class> clazz, Class> c
* @since 22.3
*/
public static void registerLambdaCapturingClass(Class> lambdaCapturingClass) {
- RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(ConfigurationCondition.alwaysTrue(), lambdaCapturingClass);
+ RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(RegistrationCondition.always(), lambdaCapturingClass);
}
/**
@@ -125,7 +124,7 @@ public static void registerLambdaCapturingClass(Class> lambdaCapturingClass) {
* @since 22.3
*/
public static void registerProxyClass(Class>... implementedInterfaces) {
- RuntimeSerializationSupport.singleton().registerProxyClass(ConfigurationCondition.alwaysTrue(), implementedInterfaces);
+ RuntimeSerializationSupport.singleton().registerProxyClass(RegistrationCondition.always(), implementedInterfaces);
}
private RuntimeSerialization() {
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
index 9d0534347cfb..4c57afb52bde 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -44,22 +44,24 @@
import java.lang.reflect.Field;
import java.util.Arrays;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+
public interface ReflectionRegistry {
- default void register(ConfigurationCondition condition, Class>... classes) {
+ default void register(RegistrationCondition condition, Class>... classes) {
Arrays.stream(classes).forEach(clazz -> register(condition, false, clazz));
}
- void register(ConfigurationCondition condition, boolean unsafeAllocated, Class> clazz);
+ void register(RegistrationCondition condition, boolean unsafeAllocated, Class> clazz);
- void register(ConfigurationCondition condition, boolean queriedOnly, Executable... methods);
+ void register(RegistrationCondition condition, boolean queriedOnly, Executable... methods);
- void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields);
+ void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields);
- void registerClassLookup(ConfigurationCondition condition, String typeName);
+ void registerClassLookup(RegistrationCondition condition, String typeName);
- void registerFieldLookup(ConfigurationCondition condition, Class> declaringClass, String fieldName);
+ void registerFieldLookup(RegistrationCondition condition, Class> declaringClass, String fieldName);
- void registerMethodLookup(ConfigurationCondition condition, Class> declaringClass, String methodName, Class>... parameterTypes);
+ void registerMethodLookup(RegistrationCondition condition, Class> declaringClass, String methodName, Class>... parameterTypes);
- void registerConstructorLookup(ConfigurationCondition condition, Class> declaringClass, Class>... parameterTypes);
+ void registerConstructorLookup(RegistrationCondition condition, Class> declaringClass, Class>... parameterTypes);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
index dd0537c496fc..e870ff0f42f5 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,10 +42,12 @@
import java.lang.invoke.MethodHandle;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+
public interface RuntimeForeignAccessSupport {
- void registerForDowncall(ConfigurationCondition condition, Object desc, Object... options);
+ void registerForDowncall(RegistrationCondition condition, Object desc, Object... options);
- void registerForUpcall(ConfigurationCondition condition, Object desc, Object... options);
+ void registerForUpcall(RegistrationCondition condition, Object desc, Object... options);
- void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, Object desc, Object... options);
+ void registerForDirectUpcall(RegistrationCondition condition, MethodHandle target, Object desc, Object... options);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
index f7ca149c3c3f..2d3ab47cd541 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -40,6 +40,8 @@
*/
package org.graalvm.nativeimage.impl;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+
public interface RuntimeProxyCreationSupport {
- void addProxyClass(ConfigurationCondition condition, Class>... interfaces);
+ void addProxyClass(RegistrationCondition condition, Class>... interfaces);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
index 8d1d11c169e3..1a79a43dced7 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java
@@ -44,38 +44,39 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
import org.graalvm.nativeimage.hosted.RuntimeProxyCreation;
public interface RuntimeReflectionSupport extends ReflectionRegistry {
// needed as reflection-specific ImageSingletons key
- void registerAllMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllDeclaredMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllDeclaredMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllFields(ConfigurationCondition condition, Class> clazz);
+ void registerAllConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllDeclaredFields(ConfigurationCondition condition, Class> clazz);
+ void registerAllDeclaredConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class> clazz);
- void registerAllConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllClassesQuery(RegistrationCondition condition, Class> clazz);
- void registerAllDeclaredConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class> clazz);
+ void registerAllDeclaredClassesQuery(RegistrationCondition condition, Class> clazz);
- void registerAllClassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllFields(RegistrationCondition condition, Class> clazz);
- void registerAllDeclaredClassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllDeclaredFields(RegistrationCondition condition, Class> clazz);
- void registerAllRecordComponentsQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllRecordComponentsQuery(RegistrationCondition condition, Class> clazz);
- void registerAllPermittedSubclassesQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllPermittedSubclassesQuery(RegistrationCondition condition, Class> clazz);
- void registerAllNestMembersQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllNestMembersQuery(RegistrationCondition condition, Class> clazz);
- void registerAllSignersQuery(ConfigurationCondition condition, Class> clazz);
+ void registerAllSignersQuery(RegistrationCondition condition, Class> clazz);
- void registerClassLookupException(ConfigurationCondition condition, String typeName, Throwable t);
+ void registerClassLookupException(RegistrationCondition condition, String typeName, Throwable t);
- default void registerClassFully(ConfigurationCondition condition, Class> clazz) {
+ default void registerClassFully(RegistrationCondition condition, Class> clazz) {
register(condition, false, clazz);
// GR-62143 Register all fields is very slow.
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
index f0c2273cbf95..24982e4faa7b 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -44,11 +44,12 @@
import java.util.Locale;
import org.graalvm.nativeimage.ImageSingletons;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
public interface RuntimeResourceSupport {
@SuppressWarnings("unchecked")
- static RuntimeResourceSupport singleton() {
+ static RuntimeResourceSupport singleton() {
return ImageSingletons.lookup(RuntimeResourceSupport.class);
}
@@ -63,15 +64,15 @@ static RuntimeResourceSupport singleton() {
void addResourceBundles(C condition, String basename, Collection locales);
/* Following functions are used only from features */
- void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath);
+ void addCondition(RegistrationCondition condition, Module module, String resourcePath);
void addResourceEntry(Module module, String resourcePath, Object origin);
default void addResource(Module module, String resourcePath, Object origin) {
- addResource(ConfigurationCondition.alwaysTrue(), module, resourcePath, origin);
+ addResource(RegistrationCondition.always(), module, resourcePath, origin);
}
- default void addResource(ConfigurationCondition condition, Module module, String resourcePath, Object origin) {
+ default void addResource(RegistrationCondition condition, Module module, String resourcePath, Object origin) {
addResourceEntry(module, resourcePath, origin);
addCondition(condition, module, resourcePath);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
index 3237047e86d8..07b056d6bb7e 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -45,11 +45,12 @@
import java.util.stream.Collectors;
import org.graalvm.nativeimage.ImageSingletons;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
public interface RuntimeSerializationSupport {
@SuppressWarnings("unchecked")
- static RuntimeSerializationSupport singleton() {
+ static RuntimeSerializationSupport singleton() {
return ImageSingletons.lookup(RuntimeSerializationSupport.class);
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java
similarity index 62%
rename from sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java
rename to sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java
index d7c56dc0dd98..514e82b5813f 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,44 +42,20 @@
import java.util.Objects;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+
/**
- * A condition that describes if a reflectively-accessed element in Native Image is visible by the
- * user at run time.
- *
- * Currently, there is only two types of condition:
- *
typeReached (the default) that signifies that the type must be both reachable by
- * static analysis at build time, and reached at run time. A type is reached at run time, right
- * before the class-initialization routine starts for that type, or any of the type's subtypes are
- * reached.
- *
typeReachable (legacy) that signifies that the type must be reachable by static
- * analysis at build time.
- *
- * When {@link ConfigurationCondition#runtimeChecked} is true denotes that this is a
+ * Type that represents both type-reached and type-reachable condition. When
+ * {@link TypeReachabilityCondition#runtimeChecked} is true denotes that this is a
* typeReached condition.
*/
-public final class ConfigurationCondition {
+public class TypeReachabilityCondition implements RegistrationCondition {
/* Cached to save space: it is used as a marker for all non-conditional elements */
- private static final ConfigurationCondition JAVA_LANG_OBJECT_REACHED = new ConfigurationCondition(Object.class, true);
-
- public static ConfigurationCondition alwaysTrue() {
- return JAVA_LANG_OBJECT_REACHED;
- }
-
+ public static final TypeReachabilityCondition JAVA_LANG_OBJECT_REACHED = new TypeReachabilityCondition(Object.class, true);
private final Class> type;
- private final boolean runtimeChecked;
-
- /**
- * Creates the default type-reached condition that is satisfied when the type is reached at
- * runtime.
- *
- * @param type that has to be reached for this condition to be satisfied
- * @return instance of the condition
- */
- public static ConfigurationCondition create(Class> type) {
- return create(type, true);
- }
+ public final boolean runtimeChecked;
/**
* Creates either a type-reached condition ({@code runtimeChecked = true}) or a type-reachable
@@ -89,31 +65,27 @@ public static ConfigurationCondition create(Class> type) {
* @param runtimeChecked makes this a type-reachable condition when false
* @return instance of the condition
*/
- public static ConfigurationCondition create(Class> type, boolean runtimeChecked) {
+ public static TypeReachabilityCondition create(Class> type, boolean runtimeChecked) {
Objects.requireNonNull(type);
- if (JAVA_LANG_OBJECT_REACHED.getType().equals(type)) {
- return JAVA_LANG_OBJECT_REACHED;
+ if (TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED.getKey().equals(type)) {
+ return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
}
- return new ConfigurationCondition(type, runtimeChecked);
+ return new TypeReachabilityCondition(type, runtimeChecked);
}
public boolean isAlwaysTrue() {
- return ConfigurationCondition.alwaysTrue().equals(this);
+ return RegistrationCondition.always().equals(this);
}
- private ConfigurationCondition(Class> type, boolean runtimeChecked) {
+ public TypeReachabilityCondition(Class> type, boolean runtimeChecked) {
this.runtimeChecked = runtimeChecked;
this.type = type;
}
- public Class> getType() {
+ public Class> getKey() {
return type;
}
- public boolean isRuntimeChecked() {
- return runtimeChecked;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -122,7 +94,7 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
- ConfigurationCondition that = (ConfigurationCondition) o;
+ TypeReachabilityCondition that = (TypeReachabilityCondition) o;
return runtimeChecked == that.runtimeChecked && Objects.equals(type, that.type);
}
@@ -133,9 +105,13 @@ public int hashCode() {
@Override
public String toString() {
- return "ConfigurationCondition(" +
+ return "TypeReachabilityCondition(" +
"type=" + type +
", runtimeChecked=" + runtimeChecked +
')';
}
+
+ public boolean isRuntimeChecked() {
+ return runtimeChecked;
+ }
}
diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
index fb7a182cda99..5ada532c3ca6 100644
--- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
+++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
@@ -42,8 +42,10 @@
import java.util.Objects;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+
/**
- * Represents a {@link ConfigurationCondition} during parsing before it is resolved in a context of
+ * Represents a {@link RegistrationCondition} during parsing before it is resolved in a context of
* the classpath.
*/
public final class UnresolvedConfigurationCondition implements Comparable {
diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
index 7af57c99b3f6..e5e4f16a4d4e 100644
--- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
+++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java
@@ -34,7 +34,7 @@
import java.util.List;
import java.util.Locale;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition;
import org.junit.Assert;
import org.junit.Test;
@@ -127,7 +127,7 @@ public void addResourceBundles(UnresolvedConfigurationCondition condition, Strin
}
@Override
- public void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath) {
+ public void addCondition(RegistrationCondition configurationCondition, Module module, String resourcePath) {
}
diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
index 5fbdb3418524..308cfd899b06 100644
--- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
+++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java
@@ -28,13 +28,13 @@
import java.util.Locale;
import org.graalvm.nativeimage.ImageSingletons;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
public interface ResourcesRegistry extends RuntimeResourceSupport {
@SuppressWarnings("unchecked")
- static ResourcesRegistry singleton() {
+ static ResourcesRegistry singleton() {
return ImageSingletons.lookup(ResourcesRegistry.class);
}
diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
index 61c884918041..67dc5737f6bc 100644
--- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
+++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java
@@ -40,7 +40,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Pattern;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition;
import com.oracle.svm.configure.ConditionalElement;
@@ -82,7 +82,7 @@ public void addResourceEntry(Module module, String resourcePath, Object origin)
}
@Override
- public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) {
+ public void addCondition(RegistrationCondition condition, Module module, String resourcePath) {
throw new UnsupportedOperationException("Unused function.");
}
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
index 3f3a411b3a13..03a52d61b325 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java
@@ -34,7 +34,7 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
@Platforms(Platform.HOSTED_ONLY.class)
public abstract class ClassLoaderSupport {
@@ -52,7 +52,7 @@ public boolean isNativeImageClassLoader(ClassLoader classLoader) {
protected abstract boolean isNativeImageClassLoaderImpl(ClassLoader classLoader);
- public record ConditionWithOrigin(ConfigurationCondition condition, Object origin) {
+ public record ConditionWithOrigin(RegistrationCondition condition, Object origin) {
}
public interface ResourceCollector {
@@ -60,7 +60,7 @@ public interface ResourceCollector {
void addResourceEntry(Module module, String resourceName, Object origin);
- void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition, Object origin);
+ void addResourceConditionally(Module module, String resourceName, RegistrationCondition condition, Object origin);
void registerNegativeQuery(Module module, String resourceName);
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
index d403da2152bc..498690fe8654 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java
@@ -33,7 +33,8 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
+import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
import com.oracle.svm.core.hub.DynamicHub;
import com.oracle.svm.core.util.VMError;
@@ -44,7 +45,7 @@
*
* If any of the {@link #conditions} is satisfied then the whole set becomes also
* {@link #satisfied}. {@link RuntimeConditionSet}s can be created at build time
- * {@link #createHosted(ConfigurationCondition)} and stored to the image heap, or it can be encoded
+ * {@link #createHosted(RegistrationCondition)} and stored to the image heap, or it can be encoded
* ({@link #getTypesForEncoding()} and later decoded at run time ({@link #createDecoded(Object[])}.
* The current implementation does not cache {@link #conditions}, although this will be implemented
* in the future (GR-49526)
@@ -60,18 +61,18 @@ public static RuntimeConditionSet emptySet() {
}
@Platforms(Platform.HOSTED_ONLY.class)
- public static RuntimeConditionSet createHosted(ConfigurationCondition condition) {
+ public static RuntimeConditionSet createHosted(RegistrationCondition condition) {
var conditionSet = new RuntimeConditionSet(new Object[0]);
conditionSet.addCondition(condition);
return conditionSet;
}
@Platforms(Platform.HOSTED_ONLY.class)
- public synchronized void addCondition(ConfigurationCondition cnd) {
- VMError.guarantee(cnd.isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
+ public synchronized void addCondition(RegistrationCondition cnd) {
+ VMError.guarantee(((TypeReachabilityCondition) cnd).isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue.");
if (satisfied) {
return;
- } else if (cnd.isAlwaysTrue()) {
+ } else if (((TypeReachabilityCondition) cnd).isAlwaysTrue()) {
conditions = null;
satisfied = true;
return;
@@ -159,11 +160,11 @@ private void setConditions(Object[] conditions) {
satisfied = false;
}
- private static Object createRuntimeCondition(ConfigurationCondition cnd) {
- if (cnd.isAlwaysTrue() || !cnd.isRuntimeChecked()) {
+ private static Object createRuntimeCondition(RegistrationCondition cnd) {
+ if (((TypeReachabilityCondition) cnd).isAlwaysTrue() || !((TypeReachabilityCondition) cnd).isRuntimeChecked()) {
throw VMError.shouldNotReachHere("We should never create run-time conditions from conditions that are always true at build time. Condition: " + cnd);
}
- return cnd.getType();
+ return ((TypeReachabilityCondition) cnd).getKey();
}
private static boolean isSatisfied(Object condition) {
@@ -190,7 +191,7 @@ private UnmodifiableRuntimeConditionSet(Object[] conditions) {
}
@Override
- public synchronized void addCondition(ConfigurationCondition cnd) {
+ public synchronized void addCondition(RegistrationCondition cnd) {
throw new UnsupportedOperationException("Can't add conditions to an unmodifiable set of conditions.");
}
}
diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
index a7818355e12e..61fb7cbb6e8e 100644
--- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
+++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java
@@ -34,7 +34,7 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platform.HOSTED_ONLY;
import org.graalvm.nativeimage.Platforms;
-import org.graalvm.nativeimage.impl.ConfigurationCondition;
+import org.graalvm.nativeimage.hosted.RegistrationCondition;
import com.oracle.svm.core.configure.ConditionalRuntimeValue;
import com.oracle.svm.core.configure.RuntimeConditionSet;
@@ -78,11 +78,11 @@ private static ClassForNameSupport[] layeredSingletons() {
@Platforms(Platform.HOSTED_ONLY.class)
public void registerClass(Class> clazz) {
- registerClass(ConfigurationCondition.alwaysTrue(), clazz);
+ registerClass(RegistrationCondition.always(), clazz);
}
@Platforms(Platform.HOSTED_ONLY.class)
- public void registerClass(ConfigurationCondition condition, Class> clazz) {
+ public void registerClass(RegistrationCondition condition, Class> clazz) {
assert !clazz.isPrimitive() : "primitive classes cannot be looked up by name";
if (PredefinedClassesSupport.isPredefined(clazz)) {
return; // must be defined at runtime before it can be looked up
@@ -134,7 +134,7 @@ private boolean isLibGraalClass(Class> clazz) {
}
public static ConditionalRuntimeValue