Skip to content

Commit 3a54ab4

Browse files
committed
Tests for missing metdata exceptions
1 parent 69765f3 commit 3a54ab4

File tree

27 files changed

+442
-165
lines changed

27 files changed

+442
-165
lines changed

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

+14
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ meth public static <%0 extends java.lang.Enum<{%%0}>> {%%0} valueOf(java.lang.Cl
3737
supr java.lang.Object
3838
hfds name,ordinal
3939

40+
CLSS public java.lang.Error
41+
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
42+
cons public init()
43+
cons public init(java.lang.String)
44+
cons public init(java.lang.String,java.lang.Throwable)
45+
cons public init(java.lang.Throwable)
46+
supr java.lang.Throwable
47+
hfds serialVersionUID
48+
4049
CLSS public java.lang.Exception
4150
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
4251
cons public init()
@@ -222,6 +231,11 @@ meth public abstract void fatalError()
222231
meth public abstract void flush()
223232
meth public abstract void log(org.graalvm.nativeimage.c.type.CCharPointer,org.graalvm.word.UnsignedWord)
224233

234+
CLSS public final org.graalvm.nativeimage.MissingReflectionRegistrationError
235+
cons public init(java.lang.String)
236+
supr java.lang.Error
237+
hfds serialVersionUID
238+
225239
CLSS public abstract interface org.graalvm.nativeimage.ObjectHandle
226240
intf org.graalvm.word.ComparableWord
227241

Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3939
* SOFTWARE.
4040
*/
41-
package org.graalvm.nativeimage.metadata;
41+
package org.graalvm.nativeimage;
4242

4343
/**
4444
* This exception is thrown when a reflective query (such as
@@ -49,10 +49,10 @@
4949
* a change in the reachability of an element will not cause changes in the behavior of the
5050
* application).
5151
*/
52-
public final class MissingReflectionMetadataException extends RuntimeException {
52+
public final class MissingReflectionRegistrationError extends Error {
5353
private static final long serialVersionUID = 1L;
5454

55-
public MissingReflectionMetadataException(String message) {
55+
public MissingReflectionRegistrationError(String message) {
5656
super(message);
5757
}
5858
}

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java

+8
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ default void registerAllRecordComponentsQuery(ConfigurationCondition condition,
9595
default void registerAllPermittedSubclassesQuery(ConfigurationCondition condition, Class<?> clazz) {
9696
}
9797

98+
@SuppressWarnings("unused")
99+
default void registerAllNestMembersQuery(ConfigurationCondition condition, Class<?> clazz) {
100+
}
101+
102+
@SuppressWarnings("unused")
103+
default void registerAllSignersQuery(ConfigurationCondition condition, Class<?> clazz) {
104+
}
105+
98106
@SuppressWarnings("unused")
99107
default void registerClassLookupException(ConfigurationCondition condition, String typeName, Throwable t) {
100108
}

substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/StandaloneHost.java

+4
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ public void onTypeReachable(AnalysisType type) {
8080
*/
8181
}
8282

83+
@Override
84+
public void onTypeInstantiated(AnalysisType newValue) {
85+
}
86+
8387
@Override
8488
public GraphBuilderPhase.Instance createGraphBuilderPhase(HostedProviders providers, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
8589
IntrinsicContext initialIntrinsicContext) {

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java

+7
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ public void checkType(ResolvedJavaType type, AnalysisUniverse universe) {
152152
*/
153153
public abstract void onTypeReachable(AnalysisType newValue);
154154

155+
/**
156+
* Run initialization tasks for a newly instantiated {@link AnalysisType}.
157+
*
158+
* @param newValue the type to initialize
159+
*/
160+
public abstract void onTypeInstantiated(AnalysisType newValue);
161+
155162
/**
156163
* Check if an {@link AnalysisType} is initialized.
157164
*/

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java

-6
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@
4141
import java.util.function.Function;
4242

4343
import org.graalvm.compiler.debug.GraalError;
44-
import org.graalvm.nativeimage.ImageSingletons;
4544
import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess;
46-
import org.graalvm.nativeimage.impl.ConfigurationCondition;
47-
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
4845
import org.graalvm.word.WordBase;
4946

5047
import com.oracle.graal.pointsto.BigBang;
@@ -580,9 +577,6 @@ protected void onReachable() {
580577
* of explicit registration of types for reflection.
581578
*/
582579
registerAsAllocated("All array types are marked as instantiated eagerly.");
583-
} else if (isAnnotation()) {
584-
/* getDeclaredMethods is called in the AnnotationType constructor */
585-
ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(ConfigurationCondition.alwaysTrue(), true, getJavaClass());
586580
}
587581
ensureOnTypeReachableTaskDone();
588582
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisUniverse.java

+1
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,7 @@ public void onFieldAccessed(AnalysisField field) {
692692
}
693693

694694
public void onTypeInstantiated(AnalysisType type, UsageKind usage) {
695+
hostVM.onTypeInstantiated(type);
695696
bb.onTypeInstantiated(type, usage);
696697
}
697698

substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/BreakpointInterceptor.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,14 @@ private static boolean getPermittedSubclasses(JNIEnvironment jni, JNIObjectHandl
273273
return handleGetClasses(jni, thread, bp, state);
274274
}
275275

276+
private static boolean getNestMembers(JNIEnvironment jni, JNIObjectHandle thread, Breakpoint bp, InterceptedState state) {
277+
return handleGetClasses(jni, thread, bp, state);
278+
}
279+
280+
private static boolean getSigners(JNIEnvironment jni, JNIObjectHandle thread, Breakpoint bp, InterceptedState state) {
281+
return handleGetClasses(jni, thread, bp, state);
282+
}
283+
276284
private static boolean handleGetClasses(JNIEnvironment jni, JNIObjectHandle thread, Breakpoint bp, InterceptedState state) {
277285
JNIObjectHandle callerClass = state.getDirectCallerClass();
278286
JNIObjectHandle self = getReceiver(thread);
@@ -1769,7 +1777,11 @@ private interface BreakpointHandler {
17691777
optionalBrk("java/lang/Class", "getRecordComponents", "()[Ljava/lang/reflect/RecordComponent;",
17701778
BreakpointInterceptor::getRecordComponents),
17711779
optionalBrk("java/lang/Class", "getPermittedSubclasses", "()[Ljava/lang/Class;",
1772-
BreakpointInterceptor::getPermittedSubclasses)
1780+
BreakpointInterceptor::getPermittedSubclasses),
1781+
optionalBrk("java/lang/Class", "getNestMembers", "()[Ljava/lang/Class;",
1782+
BreakpointInterceptor::getNestMembers),
1783+
optionalBrk("java/lang/Class", "getSigners", "()[Ljava/lang/Object;",
1784+
BreakpointInterceptor::getSigners)
17731785
};
17741786

17751787
private static boolean allocateInstance(JNIEnvironment jni, JNIObjectHandle thread, @SuppressWarnings("unused") Breakpoint bp, InterceptedState state) {

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationType.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ static ConfigurationType copyAndMerge(ConfigurationType type, ConfigurationType
9494
private boolean allDeclaredClasses;
9595
private boolean allRecordComponents;
9696
private boolean allPermittedSubclasses;
97+
private boolean allNestMembers;
98+
private boolean allSigners;
9799
private boolean allPublicClasses;
98100
private boolean allDeclaredFields;
99101
private boolean allPublicFields;
@@ -269,6 +271,8 @@ private void setFlagsFromOther(ConfigurationType other, BiPredicate<Boolean, Boo
269271
allDeclaredClasses = flagPredicate.test(allDeclaredClasses, other.allDeclaredClasses);
270272
allRecordComponents = flagPredicate.test(allRecordComponents, other.allRecordComponents);
271273
allPermittedSubclasses = flagPredicate.test(allPermittedSubclasses, other.allPermittedSubclasses);
274+
allNestMembers = flagPredicate.test(allNestMembers, other.allNestMembers);
275+
allSigners = flagPredicate.test(allSigners, other.allSigners);
272276
allPublicClasses = flagPredicate.test(allPublicClasses, other.allPublicClasses);
273277
allDeclaredFields = flagPredicate.test(allDeclaredFields, other.allDeclaredFields);
274278
allPublicFields = flagPredicate.test(allPublicFields, other.allPublicFields);
@@ -284,7 +288,7 @@ private boolean isEmpty() {
284288
}
285289

286290
private boolean allFlagsFalse() {
287-
return !(allDeclaredClasses || allRecordComponents || allPermittedSubclasses || allPublicClasses || allDeclaredFields || allPublicFields ||
291+
return !(allDeclaredClasses || allRecordComponents || allPermittedSubclasses || allNestMembers || allSigners || allPublicClasses || allDeclaredFields || allPublicFields ||
288292
allDeclaredMethodsAccess != ConfigurationMemberAccessibility.NONE || allPublicMethodsAccess != ConfigurationMemberAccessibility.NONE ||
289293
allDeclaredConstructorsAccess != ConfigurationMemberAccessibility.NONE || allPublicConstructorsAccess != ConfigurationMemberAccessibility.NONE);
290294
}
@@ -377,6 +381,14 @@ public synchronized void setAllPermittedSubclasses() {
377381
allPermittedSubclasses = true;
378382
}
379383

384+
public synchronized void setAllNestMembers() {
385+
allNestMembers = true;
386+
}
387+
388+
public synchronized void setAllSigners() {
389+
allSigners = true;
390+
}
391+
380392
public synchronized void setAllPublicClasses() {
381393
allPublicClasses = true;
382394
}
@@ -438,6 +450,8 @@ public synchronized void printJson(JsonWriter writer) throws IOException {
438450
optionallyPrintJsonBoolean(writer, allDeclaredClasses, "allDeclaredClasses");
439451
optionallyPrintJsonBoolean(writer, allRecordComponents, "allRecordComponents");
440452
optionallyPrintJsonBoolean(writer, allPermittedSubclasses, "allPermittedSubclasses");
453+
optionallyPrintJsonBoolean(writer, allNestMembers, "allNestMembers");
454+
optionallyPrintJsonBoolean(writer, allSigners, "allSigners");
441455
optionallyPrintJsonBoolean(writer, allPublicClasses, "allPublicClasses");
442456
optionallyPrintJsonBoolean(writer, allDeclaredMethodsAccess == ConfigurationMemberAccessibility.QUERIED, "queryAllDeclaredMethods");
443457
optionallyPrintJsonBoolean(writer, allPublicMethodsAccess == ConfigurationMemberAccessibility.QUERIED, "queryAllPublicMethods");
@@ -546,6 +560,14 @@ public static boolean haveAllPermittedSubclasses(ConfigurationType type) {
546560
return type.allPermittedSubclasses;
547561
}
548562

563+
public static boolean haveAllNestMembers(ConfigurationType type) {
564+
return type.allNestMembers;
565+
}
566+
567+
public static boolean haveAllSigners(ConfigurationType type) {
568+
return type.allSigners;
569+
}
570+
549571
public static boolean haveAllPublicClasses(ConfigurationType type) {
550572
return type.allPublicClasses;
551573
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ParserConfigurationAdapter.java

+10
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,16 @@ public void registerPermittedSubclasses(ConfigurationType type) {
113113
type.setAllPermittedSubclasses();
114114
}
115115

116+
@Override
117+
public void registerNestMembers(ConfigurationType type) {
118+
type.setAllNestMembers();
119+
}
120+
121+
@Override
122+
public void registerSigners(ConfigurationType type) {
123+
type.setAllSigners();
124+
}
125+
116126
@Override
117127
public void registerPublicFields(ConfigurationType type) {
118128
type.setAllPublicFields();

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/trace/ReflectionProcessor.java

+8
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ public void processEntry(EconomicMap<String, ?> entry, ConfigurationSet configur
157157
configuration.getOrCreateType(condition, clazz).setAllPermittedSubclasses();
158158
break;
159159
}
160+
case "getNestMembers": {
161+
configuration.getOrCreateType(condition, clazz).setAllNestMembers();
162+
break;
163+
}
164+
case "getSigners": {
165+
configuration.getOrCreateType(condition, clazz).setAllSigners();
166+
break;
167+
}
160168
case "getClasses": {
161169
configuration.getOrCreateType(condition, clazz).setAllPublicClasses();
162170
break;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParser.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public final class ReflectionConfigurationParser<T> extends ConfigurationParser
4848
private final ReflectionConfigurationParserDelegate<T> delegate;
4949
private static final List<String> OPTIONAL_REFLECT_CONFIG_OBJECT_ATTRS = Arrays.asList("allDeclaredConstructors", "allPublicConstructors",
5050
"allDeclaredMethods", "allPublicMethods", "allDeclaredFields", "allPublicFields",
51-
"allDeclaredClasses", "allRecordComponents", "allPermittedSubclasses", "allPublicClasses", "methods", "queriedMethods", "fields", CONDITIONAL_KEY,
51+
"allDeclaredClasses", "allRecordComponents", "allPermittedSubclasses", "allNestMembers", "allSigners",
52+
"allPublicClasses", "methods", "queriedMethods", "fields", CONDITIONAL_KEY,
5253
"queryAllDeclaredConstructors", "queryAllPublicConstructors", "queryAllDeclaredMethods", "queryAllPublicMethods", "unsafeAllocated");
5354

5455
public ReflectionConfigurationParser(ReflectionConfigurationParserDelegate<T> delegate) {
@@ -142,6 +143,16 @@ private void parseClass(EconomicMap<String, Object> data) {
142143
delegate.registerPermittedSubclasses(clazz);
143144
}
144145
break;
146+
case "allNestMembers":
147+
if (asBoolean(value, "allNestMembers")) {
148+
delegate.registerNestMembers(clazz);
149+
}
150+
break;
151+
case "allSigners":
152+
if (asBoolean(value, "allSigners")) {
153+
delegate.registerSigners(clazz);
154+
}
155+
break;
145156
case "allPublicClasses":
146157
if (asBoolean(value, "allPublicClasses")) {
147158
delegate.registerPublicClasses(clazz);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ReflectionConfigurationParserDelegate.java

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public interface ReflectionConfigurationParserDelegate<T> {
4646

4747
void registerPermittedSubclasses(T type);
4848

49+
void registerNestMembers(T type);
50+
51+
void registerSigners(T type);
52+
4953
void registerPublicFields(T type);
5054

5155
void registerDeclaredFields(T type);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
*/
2525
package com.oracle.svm.core.hub;
2626

27+
import com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils;
2728
import org.graalvm.collections.EconomicMap;
2829
import org.graalvm.nativeimage.ImageSingletons;
2930
import org.graalvm.nativeimage.Platform;
3031
import org.graalvm.nativeimage.Platforms;
3132

3233
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
33-
import com.oracle.svm.core.reflect.MissingReflectionMetadataUtils;
3434
import com.oracle.svm.core.util.ImageHeapMap;
3535
import com.oracle.svm.core.util.VMError;
3636

@@ -105,8 +105,8 @@ private static Class<?> forName(String className, ClassLoader classLoader, boole
105105
throw (ClassNotFoundException) result;
106106
}
107107
} else if (result == null) {
108-
if (MissingReflectionMetadataUtils.Options.ThrowMissingMetadataExceptions.getValue()) {
109-
throw MissingReflectionMetadataUtils.forClass(className);
108+
if (MissingReflectionRegistrationUtils.Options.ThrowMissingRegistrationErrors.getValue()) {
109+
throw MissingReflectionRegistrationUtils.forClass(className);
110110
}
111111

112112
if (returnNullOnException) {

0 commit comments

Comments
 (0)