Skip to content

Commit 01e96d6

Browse files
committed
Introduced public API for registration conditions.
ConfigurationCondition is divided into AccessCondition(API) and TypeReachabilityCondition(implementation).
1 parent 8fa7b17 commit 01e96d6

File tree

3 files changed

+246
-0
lines changed

3 files changed

+246
-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",
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
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 (e.g., reflection,
47+
* serialization, JNI access, resource access, and foreign access at runtime). Conditions prevent
48+
* unnecessary growth of the native 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 #alwaysTrue} - a condition that is always satisfied.</li>
55+
* </ul>
56+
* <p>
57+
* Conditions can be created via the {@link #alwaysTrue} and {@link #typeReached} factory methods.
58+
*
59+
* @since 25.0
60+
*/
61+
public interface AccessCondition {
62+
63+
/**
64+
* Creates the condition that is always satisfied. Any metadata that is predicated with this
65+
* condition will always be included.
66+
*
67+
* @return instance of the condition
68+
*
69+
* @since 25.0
70+
*/
71+
static AccessCondition alwaysTrue() {
72+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
73+
}
74+
75+
/**
76+
* Creates the {@code typeReached} condition that is satisfied when the type is reached at
77+
* runtime. A type is reached at runtime, if the class-initialization is triggered for that type
78+
* (right before the first step of initialization described in
79+
* <a href="https://docs.oracle.com/javase/specs/jvms/se14/html/jvms-5.html#jvms-5.5">Java Spec
80+
* - Initialization</a>), or any of the type's subtypes are reached. Metadata predicated with
81+
* this condition is only included if the condition is satisfied.
82+
* <p>
83+
* <strong>Example:</strong>
84+
*
85+
* <pre>{@code
86+
* public class App {
87+
* public static void main(String[] args) {
88+
* // ConditionType not reached => metadata is not available
89+
* Class<?> clazz = ConditionType.class;
90+
* // ConditionType not reached (ConditionType.class doesn't start class initialization)
91+
* // => metadata is not available
92+
* ConditionType.singleton();
93+
* // ConditionType reached (already initialized) => metadata is available
94+
* }
95+
* }
96+
*
97+
* class SuperType {
98+
* static {
99+
* // ConditionType reached (subtype reached) => metadata is available
100+
* }
101+
* }
102+
*
103+
* class ConditionType extends SuperType {
104+
* static {
105+
* // ConditionType reached (before static initializer) => metadata is available
106+
* }
107+
*
108+
* static ConditionType singleton() {
109+
* // ConditionType reached (already initialized) => metadata is available
110+
* }
111+
* }
112+
* }</pre>
113+
* <p>
114+
* Type is also reached, if it is marked as {@code --initialize-at-build-time} or any of its
115+
* subtypes on the classpath are marked as {@code --initialize-at-build-time}. Array types are
116+
* never marked as reached and therefore cannot be used as the type in a condition.
117+
*
118+
* @param type the type that has to be reached for this condition to be satisfied, must not be
119+
* {@code null}
120+
*
121+
* @return instance of the condition
122+
*
123+
* @since 25.0
124+
*/
125+
static AccessCondition typeReached(Class<?> type) {
126+
return TypeReachabilityCondition.create(type, true);
127+
}
128+
}
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.alwaysTrue().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)