Skip to content

Commit af47f6d

Browse files
committed
New API, within new metadata package.
1 parent dd56554 commit af47f6d

26 files changed

+1042
-582
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: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,10 +1020,10 @@ meth public abstract java.nio.file.Path getImagePath()
10201020
CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$AfterRegistrationAccess
10211021
outer org.graalvm.nativeimage.hosted.Feature
10221022
intf org.graalvm.nativeimage.hosted.Feature$FeatureAccess
1023-
meth public abstract org.graalvm.nativeimage.hosted.RuntimeJNIAccess getRuntimeJNIAccess()
1024-
meth public abstract org.graalvm.nativeimage.hosted.RuntimeReflection getRuntimeReflection()
1025-
meth public abstract org.graalvm.nativeimage.hosted.RuntimeResourceAccess getRuntimeResourceAccess()
1026-
meth public abstract org.graalvm.nativeimage.hosted.RuntimeForeignAccess getRuntimeForeignAccess()
1023+
meth public abstract org.graalvm.nativeimage.dynamicaccess.JNIAccess getJNIAccess()
1024+
meth public abstract org.graalvm.nativeimage.dynamicaccess.ReflectiveAccess getReflectiveAccess()
1025+
meth public abstract org.graalvm.nativeimage.dynamicaccess.ResourceAccess getResourceAccess()
1026+
meth public abstract org.graalvm.nativeimage.dynamicaccess.ForeignAccess getForeignAccess()
10271027

10281028
CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$BeforeAnalysisAccess
10291029
outer org.graalvm.nativeimage.hosted.Feature
@@ -1113,34 +1113,23 @@ meth public !varargs static void initializeAtRunTime(java.lang.Class<?>[])
11131113
meth public !varargs static void initializeAtRunTime(java.lang.String[])
11141114
supr java.lang.Object
11151115

1116-
CLSS public abstract interface org.graalvm.nativeimage.hosted.RuntimeForeignAccess
1116+
CLSS public final org.graalvm.nativeimage.hosted.RuntimeForeignAccess
11171117
meth public !varargs static void registerForDirectUpcall(java.lang.invoke.MethodHandle,java.lang.Object,java.lang.Object[])
11181118
meth public !varargs static void registerForDowncall(java.lang.Object,java.lang.Object[])
11191119
meth public !varargs static void registerForUpcall(java.lang.Object,java.lang.Object[])
1120-
meth public !varargs abstract void registerForDirectUpcall(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.invoke.MethodHandle,java.lang.Object,java.lang.Object[])
1121-
meth public !varargs abstract void registerForDowncall(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Object,java.lang.Object[])
1122-
meth public !varargs abstract void registerForUpcall(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Object,java.lang.Object[])
1123-
1124-
CLSS public abstract interface org.graalvm.nativeimage.hosted.RuntimeJNIAccess
1125-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Class<?>[])
1126-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.reflect.Executable[])
1127-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.reflect.Field[])
1120+
supr java.lang.Object
1121+
1122+
CLSS public final org.graalvm.nativeimage.hosted.RuntimeJNIAccess
11281123
meth public !varargs static void register(java.lang.Class<?>[])
11291124
meth public !varargs static void register(java.lang.reflect.Executable[])
11301125
meth public !varargs static void register(java.lang.reflect.Field[])
1126+
supr java.lang.Object
11311127

11321128
CLSS public final org.graalvm.nativeimage.hosted.RuntimeProxyCreation
11331129
meth public !varargs static void register(java.lang.Class<?>[])
11341130
supr java.lang.Object
11351131

1136-
CLSS public abstract interface org.graalvm.nativeimage.hosted.RuntimeReflection
1137-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Class<?>[])
1138-
meth public abstract void registerClassLookup(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.String)
1139-
meth public !varargs abstract void registerUnsafeAllocation(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Class<?>[])
1140-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.reflect.Executable[])
1141-
meth public !varargs abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.reflect.Field[])
1142-
meth public !varargs abstract void registerForSerialization(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Class<?>[])
1143-
meth public !varargs abstract java.lang.Class<?> registerProxy(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Class<?>[])
1132+
CLSS public final org.graalvm.nativeimage.hosted.RuntimeReflection
11441133
meth public !varargs static void register(boolean,boolean,java.lang.reflect.Field[])
11451134
anno 0 java.lang.Deprecated(boolean forRemoval=false, java.lang.String since="21.1")
11461135
meth public !varargs static void register(boolean,java.lang.reflect.Field[])
@@ -1166,16 +1155,41 @@ meth public static void registerAllRecordComponents(java.lang.Class<?>)
11661155
meth public static void registerAllSigners(java.lang.Class<?>)
11671156
meth public static void registerClassLookup(java.lang.String)
11681157
meth public static void registerFieldLookup(java.lang.Class<?>,java.lang.String)
1158+
supr java.lang.Object
11691159

1170-
CLSS public abstract interface org.graalvm.nativeimage.hosted.RuntimeResourceAccess
1171-
meth public abstract void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Module,java.lang.String)
1172-
meth public void register(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.String)
1173-
meth public abstract void registerResourceBundle(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.Module,java.lang.String)
1174-
meth public void registerResourceBundle(org.graalvm.nativeimage.hosted.AccessCondition,java.lang.String)
1160+
CLSS public final org.graalvm.nativeimage.hosted.RuntimeResourceAccess
11751161
meth public static void addResource(java.lang.Module,java.lang.String)
11761162
meth public static void addResource(java.lang.Module,java.lang.String,byte[])
11771163
meth public static void addResourceBundle(java.lang.Module,java.lang.String)
11781164
meth public static void addResourceBundle(java.lang.Module,java.lang.String,java.util.Locale[])
1165+
supr java.lang.Object
1166+
1167+
CLSS public abstract interface org.graalvm.nativeimage.dynamicaccess.ReflectiveAccess
1168+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Class<?>[])
1169+
meth public abstract void registerClassLookup(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.String)
1170+
meth public !varargs abstract void registerUnsafeAllocation(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Class<?>[])
1171+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.reflect.Executable[])
1172+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.reflect.Field[])
1173+
meth public !varargs abstract void registerForSerialization(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Class<?>[])
1174+
meth public !varargs abstract java.lang.Class<?> registerProxy(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Class<?>[])
1175+
1176+
CLSS public abstract interface org.graalvm.nativeimage.dynamicaccess.ResourceAccess
1177+
meth public abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Module,java.lang.String)
1178+
meth public void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.String)
1179+
meth public abstract void registerResourceBundle(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.util.ResourceBundle)
1180+
meth public abstract void registerResourceBundle(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Module,java.lang.String)
1181+
meth public void registerResourceBundle(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.String)
1182+
1183+
CLSS public abstract interface org.graalvm.nativeimage.dynamicaccess.JNIAccess
1184+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Class<?>[])
1185+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.reflect.Executable[])
1186+
meth public !varargs abstract void register(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.reflect.Field[])
1187+
1188+
CLSS public abstract interface org.graalvm.nativeimage.dynamicaccess.ForeignAccess
1189+
meth public !varargs abstract void registerForDirectUpcall(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.invoke.MethodHandle,java.lang.Object,java.lang.Object[])
1190+
meth public !varargs abstract void registerForDowncall(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Object,java.lang.Object[])
1191+
meth public !varargs abstract void registerForUpcall(org.graalvm.nativeimage.dynamicaccess.AccessCondition,java.lang.Object,java.lang.Object[])
1192+
11791193

11801194
CLSS public final org.graalvm.nativeimage.hosted.RuntimeSerialization
11811195
meth public !varargs static void register(java.lang.Class<?>[])

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/dynamicaccess/AccessCondition.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@
4141
package org.graalvm.nativeimage.dynamicaccess;
4242

4343
import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
44-
import org.graalvm.nativeimage.dynamicaccess.ForeignAccess;
45-
import org.graalvm.nativeimage.dynamicaccess.JNIAccess;
46-
import org.graalvm.nativeimage.dynamicaccess.ReflectiveAccess;
47-
import org.graalvm.nativeimage.dynamicaccess.ResourceAccess;
4844

4945
/**
5046
* A condition that must be satisfied to register elements for dynamic access (i.e., reflection,
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
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.hosted.Feature;
44+
45+
import java.lang.invoke.MethodHandle;
46+
import java.lang.invoke.MethodType;
47+
48+
/**
49+
* This interface is used to register classes, methods, and fields for foreign access at runtime. An
50+
* instance of this interface is acquired via
51+
* {@link Feature.AfterRegistrationAccess#getForeignAccess()}.
52+
* <p>
53+
* All methods in {@link ForeignAccess} require a {@link AccessCondition} as their first parameter.
54+
* Registration for foreign access will happen only if the specified condition is satisfied.
55+
*
56+
* <h3>How to use</h3>
57+
*
58+
* {@link ForeignAccess} should only be used during {@link Feature#afterRegistration}. Any attempt
59+
* to register metadata in any other phase will result in an error.
60+
* <p>
61+
* <strong>Example:</strong>
62+
*
63+
* <pre>{@code @Override
64+
* public void afterRegistration(AfterRegistrationAccess access) {
65+
* ForeignAccess foreignAccess = access.getForeignAccess();
66+
* AccessCondition condition = AccessCondition.typeReached(ConditionType.class);
67+
* foreignAccess.registerForDowncall(condition, java.lang.foreign.ValueLayout.JAVA_INT);
68+
* }
69+
* }</pre>
70+
*
71+
* @since 25.0
72+
*/
73+
public interface ForeignAccess {
74+
75+
/**
76+
* Registers the provided function descriptor and options pair at image build time for downcalls
77+
* into foreign code, if the {@code condition} is satisfied. Required to get a downcall method
78+
* handle using {@link java.lang.foreign.Linker#downcallHandle} for the same descriptor and
79+
* options at runtime.
80+
* <p>
81+
* Even though this method is weakly typed for compatibility reasons, runtime checks will be
82+
* performed to ensure that the arguments have the expected type. It will be deprecated in favor
83+
* of strongly typed variant as soon as possible.
84+
*
85+
* @param condition represents the condition that needs to be satisfied in order to access
86+
* target resources.
87+
* @param desc A {@link java.lang.foreign.FunctionDescriptor} to register for downcalls.
88+
* @param options An array of {@link java.lang.foreign.Linker.Option} used for the downcalls.
89+
*
90+
* @since 25.0
91+
*/
92+
void registerForDowncall(AccessCondition condition, Object desc, Object... options);
93+
94+
/**
95+
* Registers the provided function descriptor and options pair at image build time for upcalls
96+
* from foreign code, if the {@code condition} is satisfied. Required to get an upcall stub
97+
* function pointer using {@link java.lang.foreign.Linker#upcallStub} for the same descriptor
98+
* and options at runtime.
99+
* <p>
100+
* Even though this method is weakly typed for compatibility reasons, runtime checks will be
101+
* performed to ensure that the arguments have the expected type. It will be deprecated in favor
102+
* of strongly typed variant as soon as possible.
103+
*
104+
* @param condition represents the condition that needs to be satisfied in order to access
105+
* target resources.
106+
* @param desc A {@link java.lang.foreign.FunctionDescriptor} to register for upcalls.
107+
* @param options An array of {@link java.lang.foreign.Linker.Option} used for the upcalls.
108+
*
109+
* @since 25.0
110+
*/
111+
void registerForUpcall(AccessCondition condition, Object desc, Object... options);
112+
113+
/**
114+
* Registers a specific static method (denoted by a method handle) as a fast upcall target, if
115+
* the {@code condition} is satisfied. This will create a specialized upcall stub that will
116+
* invoke only the specified method, which is much faster than using
117+
* {@link #registerForUpcall(AccessCondition, Object, Object...)}).
118+
* <p>
119+
* The provided method handle must be a direct method handle. Those are most commonly created
120+
* using {@link java.lang.invoke.MethodHandles.Lookup#findStatic(Class, String, MethodType)}.
121+
* However, a strict requirement is that it must be possible to create a non-empty descriptor
122+
* for the method handle using {@link MethodHandle#describeConstable()}. The denoted static
123+
* method will also be registered for reflective access since run-time code will also create a
124+
* method handle to denoted static method.
125+
* </p>
126+
* <p>
127+
* Even though this method is weakly typed for compatibility reasons, runtime checks will be
128+
* performed to ensure that the arguments have the expected type. It will be deprecated in favor
129+
* of strongly typed variant as soon as possible.
130+
* </p>
131+
*
132+
* @param condition represents the condition that needs to be satisfied in order to access
133+
* target resources.
134+
* @param target A direct method handle denoting a static method.
135+
* @param desc A {@link java.lang.foreign.FunctionDescriptor} to register for upcalls.
136+
* @param options An array of {@link java.lang.foreign.Linker.Option} used for the upcalls.
137+
*
138+
* @since 25.0
139+
*/
140+
void registerForDirectUpcall(AccessCondition condition, MethodHandle target, Object desc, Object... options);
141+
}

0 commit comments

Comments
 (0)