Skip to content

Commit ac528db

Browse files
committed
Introduced public API for registration conditions.
ConfigurationCondition is divided into RegistrationCondition(API) and TypeReachabilityCondition(implementation). Replaced all usages of ConfigurationCondition.
1 parent e176dc4 commit ac528db

File tree

54 files changed

+608
-476
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+608
-476
lines changed

sdk/src/org.graalvm.nativeimage/snapshot.sigtest

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,10 @@ CLSS public abstract interface org.graalvm.nativeimage.hosted.FieldValueTransfor
10821082
meth public abstract java.lang.Object transform(java.lang.Object,java.lang.Object)
10831083
meth public boolean isAvailable()
10841084

1085+
CLSS public abstract interface org.graalvm.nativeimage.hosted.RegistrationCondition
1086+
meth public static org.graalvm.nativeimage.hosted.RegistrationCondition always()
1087+
meth public static org.graalvm.nativeimage.hosted.RegistrationCondition typeReached(java.lang.Class<?>)
1088+
10851089
CLSS public final org.graalvm.nativeimage.hosted.RuntimeClassInitialization
10861090
meth public !varargs static void initializeAtBuildTime(java.lang.Class<?>[])
10871091
meth public !varargs static void initializeAtBuildTime(java.lang.String[])
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package org.graalvm.nativeimage.hosted;
42+
43+
import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
44+
45+
/**
46+
* A condition that must be satisfied to include elements for dynamic access (e.g., reflection,
47+
* serialization, JNI access, resource access, and foreign access at runtime).
48+
* {@link RegistrationCondition} is used in conjunction with:
49+
* <ul>
50+
* <li>{@link RuntimeReflection}</li>
51+
* <li>{@link RuntimeResourceAccess}</li>
52+
* <li>{@link RuntimeJNIAccess}</li>
53+
* <li>{@link RuntimeForeignAccess}</li>
54+
* </ul>
55+
* to programmatically register metadata. Conditions prevent unnecessary growth of the native binary
56+
* size.
57+
* <p>
58+
* There are currently two types of conditions:
59+
* <ul>
60+
* <li>{@link #typeReached} - satisfied when the type is both reachable by static analysis at build
61+
* time, and reached at run time.</li>
62+
* <li>{@link #always} - a condition that is always satisfied.</li>
63+
* </ul>
64+
* <p>
65+
* Conditions can be created via the {@link #always} and {@link #typeReached} factory methods.
66+
*
67+
* @since 25.0
68+
*/
69+
public interface RegistrationCondition {
70+
71+
/**
72+
* Creates the condition that is always satisfied. Any metadata that is predicated with this
73+
* condition will always be included.
74+
*
75+
* @return instance of the condition
76+
*
77+
* @since 25.0
78+
*/
79+
static RegistrationCondition always() {
80+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
81+
}
82+
83+
/**
84+
* Creates the {@code typeReached} condition that is satisfied when the type is reached at
85+
* runtime. A type is reached at runtime, right before the class-initialization routine starts
86+
* for that type, or any of the type's subtypes are reached. Metadata predicated with this
87+
* condition is only included if the condition is satisfied.
88+
* <p>
89+
* <strong>Example:</strong>
90+
*
91+
* <pre>{@code
92+
* class SuperType {
93+
* static {
94+
* // ConditionType reached (subtype reached) => metadata is available
95+
* }
96+
* }
97+
*
98+
* class ConditionType extends SuperType {
99+
* static {
100+
* // ConditionType reached (before static initializer) => metadata is available
101+
* }
102+
*
103+
* static ConditionType singleton() {
104+
* // ConditionType reached (already initialized) => metadata is available
105+
* }
106+
* }
107+
*
108+
* public class App {
109+
* public static void main(String[] args) {
110+
* // ConditionType not reached => metadata is not available
111+
* Class<?> clazz = ConditionType.class;
112+
* // ConditionType not reached (ConditionType.class doesn't start class initialization)
113+
* // => metadata is not available
114+
* ConditionType.singleton();
115+
* // ConditionType reached (already initialized) => metadata is available
116+
* }
117+
* }
118+
* }</pre>
119+
* <p>
120+
* Type is also reached, if it is marked as {@code --initialize-at-build-time} or any of its
121+
* subtypes are marked as {@code --initialize-at-build-time} and they exist on the classpath.
122+
* Array types are never marked as reached and therefore cannot be used as the type in a
123+
* condition.
124+
*
125+
* @param type the type that has to be reached for this condition to be satisfied, must not be
126+
* {@code null}
127+
*
128+
* @return instance of the condition
129+
*
130+
* @since 25.0
131+
*/
132+
static RegistrationCondition typeReached(Class<?> type) {
133+
return TypeReachabilityCondition.create(type, true);
134+
}
135+
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2023, 2025, 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
@@ -46,7 +46,6 @@
4646
import org.graalvm.nativeimage.ImageSingletons;
4747
import org.graalvm.nativeimage.Platform;
4848
import org.graalvm.nativeimage.Platforms;
49-
import org.graalvm.nativeimage.impl.ConfigurationCondition;
5049
import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport;
5150

5251
@Platforms(Platform.HOSTED_ONLY.class)
@@ -68,7 +67,7 @@ public final class RuntimeForeignAccess {
6867
* @since 23.1
6968
*/
7069
public static void registerForDowncall(Object desc, Object... options) {
71-
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(ConfigurationCondition.alwaysTrue(), desc, options);
70+
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(RegistrationCondition.always(), desc, options);
7271
}
7372

7473
/**
@@ -86,7 +85,7 @@ public static void registerForDowncall(Object desc, Object... options) {
8685
* @since 24.1
8786
*/
8887
public static void registerForUpcall(Object desc, Object... options) {
89-
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(ConfigurationCondition.alwaysTrue(), desc, options);
88+
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(RegistrationCondition.always(), desc, options);
9089
}
9190

9291
/**
@@ -114,7 +113,7 @@ public static void registerForUpcall(Object desc, Object... options) {
114113
* @since 24.2
115114
*/
116115
public static void registerForDirectUpcall(MethodHandle target, Object desc, Object... options) {
117-
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(ConfigurationCondition.alwaysTrue(), target, desc, options);
116+
ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(RegistrationCondition.always(), target, desc, options);
118117
}
119118

120119
private RuntimeForeignAccess() {

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

Lines changed: 4 additions & 5 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, 2025, 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
@@ -46,7 +46,6 @@
4646
import org.graalvm.nativeimage.ImageSingletons;
4747
import org.graalvm.nativeimage.Platform;
4848
import org.graalvm.nativeimage.Platforms;
49-
import org.graalvm.nativeimage.impl.ConfigurationCondition;
5049
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
5150

5251
/**
@@ -66,7 +65,7 @@ public final class RuntimeJNIAccess {
6665
* @since 22.3
6766
*/
6867
public static void register(Class<?>... classes) {
69-
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
68+
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), classes);
7069
}
7170

7271
/**
@@ -79,7 +78,7 @@ public static void register(Class<?>... classes) {
7978
* @since 22.3
8079
*/
8180
public static void register(Executable... methods) {
82-
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods);
81+
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, methods);
8382
}
8483

8584
/**
@@ -92,7 +91,7 @@ public static void register(Executable... methods) {
9291
* @since 22.3
9392
*/
9493
public static void register(Field... fields) {
95-
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
94+
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, fields);
9695
}
9796

9897
private RuntimeJNIAccess() {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2025, 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,7 +43,6 @@
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;
4746
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
4847

4948
/**
@@ -62,7 +61,7 @@ public final class RuntimeProxyCreation {
6261
* @since 22.3
6362
*/
6463
public static void register(Class<?>... interfaces) {
65-
ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces);
64+
ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(RegistrationCondition.always(), interfaces);
6665
}
6766

6867
private RuntimeProxyCreation() {

0 commit comments

Comments
 (0)