Skip to content

Commit da799cd

Browse files
committed
Add getModifiers substitutions that mask out NI-internal modifier bits
1 parent be2d761 commit da799cd

File tree

5 files changed

+65
-6
lines changed

5 files changed

+65
-6
lines changed

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
import java.util.List;
3737
import java.util.function.Function;
3838

39+
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Constructor;
40+
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Field;
41+
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Method;
42+
import com.oracle.svm.core.util.VMError;
3943
import org.graalvm.nativeimage.Platforms;
4044
import org.graalvm.nativeimage.impl.InternalPlatform;
4145

@@ -110,6 +114,36 @@ static List<byte[]> getEncodings() {
110114
return Arrays.stream(MultiLayeredImageSingleton.getAllLayers(RuntimeMetadataEncoding.class)).map(RuntimeMetadataEncoding::getEncoding).toList();
111115
}
112116

117+
public static int clearInternalModifiers(int modifiers) {
118+
return modifiers & (~ALL_FLAGS_MASK);
119+
}
120+
121+
public static int getRawModifiers(Method m) {
122+
assert m != null;
123+
return SubstrateUtil.cast(m, Target_java_lang_reflect_Method.class).modifiers;
124+
}
125+
126+
public static int getRawModifiers(Constructor<?> c) {
127+
assert c != null;
128+
return SubstrateUtil.cast(c, Target_java_lang_reflect_Constructor.class).modifiers;
129+
}
130+
131+
public static int getRawModifiers(Executable ex) {
132+
assert ex != null;
133+
if (ex instanceof Method m) {
134+
return getRawModifiers(m);
135+
} else if (ex instanceof Constructor<?> c) {
136+
return getRawModifiers(c);
137+
} else {
138+
throw VMError.shouldNotReachHere("Unexpected executable type");
139+
}
140+
}
141+
142+
public static int getRawModifiers(Field f) {
143+
assert f != null;
144+
return SubstrateUtil.cast(f, Target_java_lang_reflect_Field.class).modifiers;
145+
}
146+
113147
/**
114148
* Fields encoding.
115149
*

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import java.util.function.BiFunction;
8787
import java.util.function.IntFunction;
8888

89+
import com.oracle.svm.core.code.RuntimeMetadataDecoderImpl;
8990
import org.graalvm.nativeimage.AnnotationAccess;
9091
import org.graalvm.nativeimage.ImageSingletons;
9192
import org.graalvm.nativeimage.Platform;
@@ -1467,7 +1468,7 @@ private void checkField(String fieldName, Field field, boolean publicOnly) throw
14671468
throw new NoSuchFieldException(fieldName);
14681469
} else {
14691470
RuntimeMetadataDecoder decoder = ImageSingletons.lookup(RuntimeMetadataDecoder.class);
1470-
int fieldModifiers = field.getModifiers();
1471+
int fieldModifiers = RuntimeMetadataDecoderImpl.getRawModifiers(field);
14711472
boolean negative = decoder.isNegative(fieldModifiers);
14721473
boolean hiding = decoder.isHiding(fieldModifiers);
14731474
if (throwMissingErrors && hiding) {
@@ -1550,7 +1551,7 @@ private boolean checkExecutableExists(String methodName, Class<?>[] parameterTyp
15501551
return true;
15511552
} else {
15521553
RuntimeMetadataDecoder decoder = ImageSingletons.lookup(RuntimeMetadataDecoder.class);
1553-
int methodModifiers = method.getModifiers();
1554+
int methodModifiers = RuntimeMetadataDecoderImpl.getRawModifiers(method);
15541555
boolean negative = decoder.isNegative(methodModifiers);
15551556
boolean hiding = decoder.isHiding(methodModifiers);
15561557
if (throwMissingErrors && hiding) {
@@ -2350,7 +2351,7 @@ private static Field[] filterFields(Field... fields) {
23502351
List<Field> filtered = new ArrayList<>();
23512352
RuntimeMetadataDecoder decoder = ImageSingletons.lookup(RuntimeMetadataDecoder.class);
23522353
for (Field field : fields) {
2353-
int modifiers = field.getModifiers();
2354+
int modifiers = RuntimeMetadataDecoderImpl.getRawModifiers(field);
23542355
if (!decoder.isHiding(modifiers) && !decoder.isNegative(modifiers)) {
23552356
filtered.add(field);
23562357
}
@@ -2362,7 +2363,7 @@ private static Method[] filterMethods(Method... methods) {
23622363
List<Method> filtered = new ArrayList<>();
23632364
RuntimeMetadataDecoder decoder = ImageSingletons.lookup(RuntimeMetadataDecoder.class);
23642365
for (Method method : methods) {
2365-
int modifiers = method.getModifiers();
2366+
int modifiers = RuntimeMetadataDecoderImpl.getRawModifiers(method);
23662367
if (!decoder.isHiding(modifiers) && !decoder.isNegative(modifiers)) {
23672368
filtered.add(method);
23682369
}
@@ -2374,7 +2375,7 @@ private static Constructor<?>[] filterConstructors(Constructor<?>... constructor
23742375
List<Constructor<?>> filtered = new ArrayList<>();
23752376
RuntimeMetadataDecoder decoder = ImageSingletons.lookup(RuntimeMetadataDecoder.class);
23762377
for (Constructor<?> constructor : constructors) {
2377-
if (!decoder.isNegative(constructor.getModifiers())) {
2378+
if (!decoder.isNegative(RuntimeMetadataDecoderImpl.getRawModifiers(constructor))) {
23782379
filtered.add(constructor);
23792380
}
23802381
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/Target_java_lang_reflect_Constructor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.lang.reflect.Constructor;
3131
import java.lang.reflect.Executable;
3232

33+
import com.oracle.svm.core.code.RuntimeMetadataDecoderImpl;
3334
import org.graalvm.nativeimage.ImageSingletons;
3435

3536
import com.oracle.svm.configure.config.ConfigurationMemberInfo;
@@ -60,6 +61,9 @@ public final class Target_java_lang_reflect_Constructor {
6061
@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = ParameterAnnotationsComputer.class)//
6162
byte[] parameterAnnotations;
6263

64+
@Alias //
65+
public int modifiers;
66+
6367
/**
6468
* Value of the accessor when `this` is in the image heap. `null` for run-time constructed
6569
* constructors.
@@ -99,6 +103,11 @@ public Target_jdk_internal_reflect_ConstructorAccessor acquireConstructorAccesso
99103
return constructorAccessorFromMetadata;
100104
}
101105

106+
@Substitute
107+
public int getModifiers() {
108+
return RuntimeMetadataDecoderImpl.clearInternalModifiers(modifiers);
109+
}
110+
102111
static class AnnotationsComputer extends ReflectionMetadataComputer {
103112
@Override
104113
public Object transform(Object receiver, Object originalValue) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/Target_java_lang_reflect_Field.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.lang.reflect.Modifier;
3333
import java.util.Map;
3434

35+
import com.oracle.svm.core.code.RuntimeMetadataDecoderImpl;
3536
import org.graalvm.nativeimage.ImageSingletons;
3637

3738
import com.oracle.svm.core.BuildPhaseProvider;
@@ -85,6 +86,9 @@ public final class Target_java_lang_reflect_Field {
8586
@Alias //
8687
boolean override;
8788

89+
@Alias //
90+
public int modifiers;
91+
8892
@Alias //
8993
public Target_java_lang_reflect_Field root;
9094

@@ -135,6 +139,11 @@ private byte[] getTypeAnnotationBytes0() {
135139
return SubstrateUtil.cast(this, Target_java_lang_reflect_AccessibleObject.class).typeAnnotations;
136140
}
137141

142+
@Substitute
143+
public int getModifiers() {
144+
return RuntimeMetadataDecoderImpl.clearInternalModifiers(modifiers);
145+
}
146+
138147
public static final class FieldDeletionReasonComputer implements FieldValueTransformerWithAvailability {
139148
@Override
140149
public boolean isAvailable() {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/Target_java_lang_reflect_Method.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.lang.reflect.Method;
3333
import java.nio.ByteBuffer;
3434

35+
import com.oracle.svm.core.code.RuntimeMetadataDecoderImpl;
3536
import org.graalvm.nativeimage.ImageSingletons;
3637
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
3738

@@ -102,7 +103,7 @@ public final class Target_java_lang_reflect_Method {
102103
private Class<?>[] exceptionTypes;
103104

104105
@Alias //
105-
private int modifiers;
106+
public int modifiers;
106107

107108
@Alias //
108109
private transient String signature;
@@ -192,6 +193,11 @@ Target_java_lang_reflect_Method copy() {
192193
return res;
193194
}
194195

196+
@Substitute
197+
public int getModifiers() {
198+
return RuntimeMetadataDecoderImpl.clearInternalModifiers(modifiers);
199+
}
200+
195201
static class AnnotationsComputer extends ReflectionMetadataComputer {
196202
@Override
197203
public Object transform(Object receiver, Object originalValue) {

0 commit comments

Comments
 (0)