Skip to content

Commit d2fe7e6

Browse files
committed
Introduced public API for registration conditions.
ConfigurationCondition is divided into AccessCondition(API) and TypeReachabilityCondition(implementation).
1 parent a0316f8 commit d2fe7e6

File tree

4 files changed

+255
-0
lines changed

4 files changed

+255
-0
lines changed

sdk/mx.sdk/suite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,7 @@ class UniversalDetector {
970970
"exports" : [
971971
"com.oracle.svm.core.annotate",
972972
"org.graalvm.nativeimage.hosted",
973+
"org.graalvm.nativeimage.dynamicaccess",
973974
"org.graalvm.nativeimage.c.function",
974975
"org.graalvm.nativeimage.c.struct",
975976
"org.graalvm.nativeimage.c.type",

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,13 @@ CLSS public abstract interface org.graalvm.nativeimage.hosted.FieldValueTransfor
10931093
meth public abstract java.lang.Object transform(java.lang.Object,java.lang.Object)
10941094
meth public boolean isAvailable()
10951095

1096+
<<<<<<< Updated upstream
1097+
=======
1098+
CLSS public abstract interface org.graalvm.nativeimage.dynamicaccess.AccessCondition
1099+
meth public static org.graalvm.nativeimage.dynamicaccess.AccessCondition unconditional()
1100+
meth public static org.graalvm.nativeimage.dynamicaccess.AccessCondition typeReached(java.lang.Class<?>)
1101+
1102+
>>>>>>> Stashed changes
10961103
CLSS public final org.graalvm.nativeimage.hosted.RuntimeClassInitialization
10971104
meth public !varargs static void initializeAtBuildTime(java.lang.Class<?>[])
10981105
meth public !varargs static void initializeAtBuildTime(java.lang.String[])
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
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.dynamicaccess;
42+
43+
import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
44+
45+
/**
46+
* A condition that must be satisfied to register elements for dynamic access (i.e., reflection,
47+
* serialization, JNI access, resource access, and foreign access at runtime). Conditions should be
48+
* used whenever possible to constrain unnecessary growth of the binary size.
49+
* <p>
50+
* There are currently two types of conditions:
51+
* <ul>
52+
* <li>{@link #typeReached} - satisfied when the type is both reachable by static analysis at build
53+
* time, and reached at run time.</li>
54+
* <li>{@link #unconditional} - a condition that is always satisfied. This condition should be
55+
* avoided to prevent unnecessary increases in binary size.</li>
56+
* </ul>
57+
* <p>
58+
* Conditions can only be created via the {@link #unconditional} and {@link #typeReached} factory
59+
* methods.
60+
*
61+
* @since 25.0
62+
*/
63+
public interface AccessCondition {
64+
65+
/**
66+
* Creates the condition that is always satisfied. Any element that is predicated with this
67+
* condition will always be included.
68+
*
69+
* @return instance of the condition
70+
*
71+
* @since 25.0
72+
*/
73+
static AccessCondition unconditional() {
74+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
75+
}
76+
77+
/**
78+
* Creates the {@code typeReached} condition that is satisfied when the type is reached at
79+
* runtime. A type is reached at runtime, if the class-initialization is triggered for that type
80+
* (right before the first step of initialization described in
81+
* <a href="https://docs.oracle.com/javase/specs/jvms/se14/html/jvms-5.html#jvms-5.5">Java Spec
82+
* - Initialization</a>), or any of the type's subtypes are reached. Metadata predicated with
83+
* this condition is only included if the condition is satisfied.
84+
* <p>
85+
* <strong>Example:</strong>
86+
*
87+
* <pre>{@code
88+
* public class App {
89+
* public static void main(String[] args) {
90+
* // ConditionType not reached => metadata is not available
91+
* Class<?> clazz = ConditionType.class;
92+
* // ConditionType not reached (ConditionType.class doesn't start class initialization)
93+
* // => metadata is not available
94+
* ConditionType.singleton();
95+
* // ConditionType reached (already initialized) => metadata is available
96+
* }
97+
* }
98+
*
99+
* class SuperType {
100+
* static {
101+
* // ConditionType reached (subtype reached) => metadata is available
102+
* }
103+
* }
104+
*
105+
* class ConditionType extends SuperType {
106+
* static {
107+
* // ConditionType reached (before static initializer) => metadata is available
108+
* }
109+
*
110+
* static ConditionType singleton() {
111+
* // ConditionType reached (already initialized) => metadata is available
112+
* }
113+
* }
114+
* }</pre>
115+
* <p>
116+
* Type is also reached, if it is marked as {@code --initialize-at-build-time} or any of its
117+
* subtypes on the classpath are marked as {@code --initialize-at-build-time}. Array types are
118+
* never marked as reached and therefore cannot be used as the type in a condition.
119+
*
120+
* @param type the type that has to be reached for this condition to be satisfied, must not be
121+
* {@code null}
122+
*
123+
* @return instance of the condition
124+
*
125+
* @since 25.0
126+
*/
127+
static AccessCondition typeReached(Class<?> type) {
128+
return TypeReachabilityCondition.create(type, true);
129+
}
130+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
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.impl;
42+
43+
import java.util.Objects;
44+
45+
import org.graalvm.nativeimage.dynamicaccess.AccessCondition;
46+
47+
/**
48+
* Type that represents both {@code typeReached} and {@code typeReachable} condition. When
49+
* {@link TypeReachabilityCondition#runtimeChecked} is <code>true</code> denotes that this is a
50+
* <code>typeReached</code> condition.
51+
*/
52+
public final class TypeReachabilityCondition implements AccessCondition {
53+
54+
/* Cached to save space: it is used as a marker for all non-conditional elements */
55+
public static final TypeReachabilityCondition JAVA_LANG_OBJECT_REACHED = new TypeReachabilityCondition(Object.class, true);
56+
private final Class<?> type;
57+
58+
private final boolean runtimeChecked;
59+
60+
/**
61+
* Creates either a type-reached condition ({@code runtimeChecked = true}) or a type-reachable
62+
* condition.
63+
*
64+
* @param type that has to be reached (or reachable) for this condition to be satisfied
65+
* @param runtimeChecked makes this a type-reachable condition when false
66+
* @return instance of the condition
67+
*/
68+
public static TypeReachabilityCondition create(Class<?> type, boolean runtimeChecked) {
69+
Objects.requireNonNull(type);
70+
if (TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED.getType().equals(type)) {
71+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
72+
}
73+
return new TypeReachabilityCondition(type, runtimeChecked);
74+
}
75+
76+
private TypeReachabilityCondition(Class<?> type, boolean runtimeChecked) {
77+
this.runtimeChecked = runtimeChecked;
78+
this.type = type;
79+
}
80+
81+
public boolean isAlwaysTrue() {
82+
return AccessCondition.unconditional().equals(this);
83+
}
84+
85+
public Class<?> getType() {
86+
return type;
87+
}
88+
89+
public boolean isRuntimeChecked() {
90+
return runtimeChecked;
91+
}
92+
93+
@Override
94+
public boolean equals(Object o) {
95+
if (this == o) {
96+
return true;
97+
}
98+
if (o == null || getClass() != o.getClass()) {
99+
return false;
100+
}
101+
TypeReachabilityCondition that = (TypeReachabilityCondition) o;
102+
return runtimeChecked == that.runtimeChecked && Objects.equals(type, that.type);
103+
}
104+
105+
@Override
106+
public int hashCode() {
107+
return Objects.hash(type, runtimeChecked);
108+
}
109+
110+
@Override
111+
public String toString() {
112+
return "TypeReachabilityCondition(" +
113+
"type=" + type +
114+
", runtimeChecked=" + runtimeChecked +
115+
')';
116+
}
117+
}

0 commit comments

Comments
 (0)