Skip to content

Commit f696872

Browse files
committed
[GR-57645] Support registering elements for reflection in extension layers
PullRequest: graal/20440
2 parents 235dcea + d5bcc3b commit f696872

14 files changed

+547
-74
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeMetadataDecoderImpl.java

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public class RuntimeMetadataDecoderImpl implements RuntimeMetadataDecoder {
9494
// Value from Reflection.getClassAccessFlags()
9595
public static final int CLASS_ACCESS_FLAGS_MASK = 0x1FFF;
9696

97-
static byte[] getEncoding(DynamicHub hub) {
98-
return MultiLayeredImageSingleton.getForLayer(RuntimeMetadataEncoding.class, hub.getLayerId()).getEncoding();
97+
static byte[] getEncoding(int layerId) {
98+
return MultiLayeredImageSingleton.getForLayer(RuntimeMetadataEncoding.class, layerId).getEncoding();
9999
}
100100

101101
static List<byte[]> getEncodings() {
@@ -110,16 +110,14 @@ static List<byte[]> getEncodings() {
110110
* </pre>
111111
*/
112112
@Override
113-
public Field[] parseFields(DynamicHub declaringType, int index, boolean publicOnly) {
114-
int layerId = declaringType.getLayerId();
115-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
113+
public Field[] parseFields(DynamicHub declaringType, int index, boolean publicOnly, int layerId) {
114+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
116115
return decodeArray(reader, Field.class, (i) -> (Field) decodeField(reader, DynamicHub.toClass(declaringType), publicOnly, true, layerId), layerId);
117116
}
118117

119118
@Override
120-
public FieldDescriptor[] parseReachableFields(DynamicHub declaringType, int index) {
121-
int layerId = declaringType.getLayerId();
122-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
119+
public FieldDescriptor[] parseReachableFields(DynamicHub declaringType, int index, int layerId) {
120+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
123121
return decodeArray(reader, FieldDescriptor.class, (i) -> (FieldDescriptor) decodeField(reader, DynamicHub.toClass(declaringType), false, false, layerId), layerId);
124122
}
125123

@@ -131,16 +129,14 @@ public FieldDescriptor[] parseReachableFields(DynamicHub declaringType, int inde
131129
* </pre>
132130
*/
133131
@Override
134-
public Method[] parseMethods(DynamicHub declaringType, int index, boolean publicOnly) {
135-
int layerId = declaringType.getLayerId();
136-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
132+
public Method[] parseMethods(DynamicHub declaringType, int index, boolean publicOnly, int layerId) {
133+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
137134
return decodeArray(reader, Method.class, (i) -> (Method) decodeExecutable(reader, DynamicHub.toClass(declaringType), publicOnly, true, true, layerId), layerId);
138135
}
139136

140137
@Override
141-
public MethodDescriptor[] parseReachableMethods(DynamicHub declaringType, int index) {
142-
int layerId = declaringType.getLayerId();
143-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
138+
public MethodDescriptor[] parseReachableMethods(DynamicHub declaringType, int index, int layerId) {
139+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
144140
return decodeArray(reader, MethodDescriptor.class, (i) -> (MethodDescriptor) decodeExecutable(reader, DynamicHub.toClass(declaringType), false, false, true, layerId), layerId);
145141
}
146142

@@ -152,16 +148,14 @@ public MethodDescriptor[] parseReachableMethods(DynamicHub declaringType, int in
152148
* </pre>
153149
*/
154150
@Override
155-
public Constructor<?>[] parseConstructors(DynamicHub declaringType, int index, boolean publicOnly) {
156-
int layerId = declaringType.getLayerId();
157-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
151+
public Constructor<?>[] parseConstructors(DynamicHub declaringType, int index, boolean publicOnly, int layerId) {
152+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
158153
return decodeArray(reader, Constructor.class, (i) -> (Constructor<?>) decodeExecutable(reader, DynamicHub.toClass(declaringType), publicOnly, true, false, layerId), layerId);
159154
}
160155

161156
@Override
162-
public ConstructorDescriptor[] parseReachableConstructors(DynamicHub declaringType, int index) {
163-
int layerId = declaringType.getLayerId();
164-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
157+
public ConstructorDescriptor[] parseReachableConstructors(DynamicHub declaringType, int index, int layerId) {
158+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(layerId), index, ByteArrayReader.supportsUnalignedMemoryAccess());
165159
return decodeArray(reader, ConstructorDescriptor.class, (i) -> (ConstructorDescriptor) decodeExecutable(reader, DynamicHub.toClass(declaringType), false, false, false, layerId),
166160
layerId);
167161
}
@@ -175,7 +169,7 @@ public ConstructorDescriptor[] parseReachableConstructors(DynamicHub declaringTy
175169
*/
176170
@Override
177171
public Class<?>[] parseClasses(int index, DynamicHub declaringType) {
178-
return parseClasses(index, getEncoding(declaringType), declaringType.getLayerId());
172+
return parseClasses(index, getEncoding(declaringType.getLayerId()), declaringType.getLayerId());
179173
}
180174

181175
@Override
@@ -201,9 +195,8 @@ private static Class<?>[] parseClasses(int index, byte[] encoding, int layerId)
201195
* </pre>
202196
*/
203197
@Override
204-
public RecordComponent[] parseRecordComponents(DynamicHub declaringType, int index) {
205-
int layerId = declaringType.getLayerId();
206-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
198+
public RecordComponent[] parseRecordComponents(DynamicHub declaringType, int index, int layerId) {
199+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType.getLayerId()), index, ByteArrayReader.supportsUnalignedMemoryAccess());
207200
return decodeArray(reader, RecordComponent.class, (i) -> decodeRecordComponent(reader, DynamicHub.toClass(declaringType), layerId), layerId);
208201
}
209202

@@ -216,7 +209,7 @@ public RecordComponent[] parseRecordComponents(DynamicHub declaringType, int ind
216209
*/
217210
@Override
218211
public Object[] parseObjects(int index, DynamicHub declaringType) {
219-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
212+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType.getLayerId()), index, ByteArrayReader.supportsUnalignedMemoryAccess());
220213
int layerId = declaringType.getLayerId();
221214
return decodeArray(reader, Object.class, (i) -> decodeObject(reader, layerId), layerId);
222215
}
@@ -253,7 +246,7 @@ public Object[] parseEnclosingMethod(int index, DynamicHub declaringType) {
253246
if (isErrorIndex(index)) {
254247
decodeAndThrowError(index, layerId);
255248
}
256-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
249+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType.getLayerId()), index, ByteArrayReader.supportsUnalignedMemoryAccess());
257250
Class<?> declaringClass = decodeType(reader, layerId);
258251
String name = decodeMemberName(reader, layerId);
259252
String descriptor = decodeOtherString(reader, layerId);
@@ -262,7 +255,7 @@ public Object[] parseEnclosingMethod(int index, DynamicHub declaringType) {
262255

263256
@Override
264257
public byte[] parseByteArray(int index, DynamicHub declaringType) {
265-
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType), index, ByteArrayReader.supportsUnalignedMemoryAccess());
258+
UnsafeArrayTypeReader reader = UnsafeArrayTypeReader.create(getEncoding(declaringType.getLayerId()), index, ByteArrayReader.supportsUnalignedMemoryAccess());
266259
return decodeByteArray(reader);
267260
}
268261

@@ -530,7 +523,7 @@ private static Object decodeExecutable(UnsafeArrayTypeReader buf, Class<?> decla
530523
*/
531524
if (isMethod) {
532525
executable = ReflectionObjectFactory.newMethod(conditions, declaringClass, executable.getName(), executable.getParameterTypes(), Object.class, null, modifiers | NEGATIVE_FLAG_MASK,
533-
null, null, null, null, null, null, null);
526+
null, null, null, null, null, null, null, layerId);
534527
} else {
535528
executable = ReflectionObjectFactory.newConstructor(conditions, declaringClass, executable.getParameterTypes(), null, modifiers | NEGATIVE_FLAG_MASK, null, null, null, null, null,
536529
null);
@@ -576,7 +569,7 @@ private static Object decodeExecutable(UnsafeArrayTypeReader buf, Class<?> decla
576569
return new MethodDescriptor(declaringClass, name, (String[]) parameterTypes);
577570
}
578571
return ReflectionObjectFactory.newMethod(conditions, declaringClass, name, (Class<?>[]) parameterTypes, negative ? Object.class : returnType, null, modifiers,
579-
null, null, null, null, null, null, null);
572+
null, null, null, null, null, null, null, layerId);
580573
} else {
581574
if (!reflectOnly) {
582575
return new ConstructorDescriptor(declaringClass, (String[]) parameterTypes);
@@ -599,7 +592,7 @@ private static Object decodeExecutable(UnsafeArrayTypeReader buf, Class<?> decla
599592
Target_java_lang_reflect_Executable executable;
600593
if (isMethod) {
601594
Method method = ReflectionObjectFactory.newMethod(conditions, declaringClass, name, (Class<?>[]) parameterTypes, returnType, exceptionTypes, modifiers,
602-
signature, annotations, parameterAnnotations, annotationDefault, accessor, reflectParameters, typeAnnotations);
595+
signature, annotations, parameterAnnotations, annotationDefault, accessor, reflectParameters, typeAnnotations, layerId);
603596
if (!reflectOnly) {
604597
return new MethodDescriptor(method);
605598
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,13 @@ private static Class<?> forName(String className, ClassLoader classLoader, boole
196196
}
197197
Object result = null;
198198
for (var singleton : layeredSingletons()) {
199-
result = singleton.forName0(className, classLoader);
200-
if (result != null) {
199+
Object newResult = singleton.forName0(className, classLoader);
200+
result = newResult != null ? newResult : result;
201+
/*
202+
* The class might have been registered in a shared layer but was not yet available. In
203+
* that case, the extension layers need to be checked too.
204+
*/
205+
if (result != null && result != NEGATIVE_QUERY) {
201206
break;
202207
}
203208
}

0 commit comments

Comments
 (0)