Skip to content

Commit 6a8bff3

Browse files
committed
Fix constructor accessor checks
1 parent 7a66c26 commit 6a8bff3

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/methodhandles/Target_java_lang_invoke_MethodHandle.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Constructor;
5454
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Field;
5555
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Method;
56+
import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_ConstructorAccessor;
5657
import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_MethodAccessor;
5758
import com.oracle.svm.core.util.VMError;
5859

@@ -280,8 +281,12 @@ private static SubstrateConstructorAccessor asConstructor(Target_java_lang_invok
280281
return getConstructorAccessor(constructor);
281282
}
282283

284+
@SuppressWarnings("DataFlowIssue")
283285
private static SubstrateConstructorAccessor getConstructorAccessor(Constructor<?> constructor) {
284-
return SubstrateUtil.cast(SubstrateUtil.cast(constructor, Target_java_lang_reflect_Constructor.class).acquireConstructorAccessor(), SubstrateConstructorAccessor.class);
286+
Target_java_lang_reflect_Constructor internalConstructorAccessor = SubstrateUtil.cast(constructor, Target_java_lang_reflect_Constructor.class);
287+
Target_jdk_internal_reflect_ConstructorAccessor constructorAccessor = internalConstructorAccessor.constructorAccessor;
288+
var result = constructorAccessor == null ? internalConstructorAccessor.acquireConstructorAccessor() : constructorAccessor;
289+
return SubstrateUtil.cast(result, SubstrateConstructorAccessor.class);
285290
}
286291

287292
private static <T extends AccessibleObject & Member> void checkMember(T member, boolean isStatic) {

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.oracle.svm.core.annotate.Substitute;
4343
import com.oracle.svm.core.annotate.TargetClass;
4444
import com.oracle.svm.core.annotate.TargetElement;
45+
import com.oracle.svm.core.configure.RuntimeConditionSet;
4546
import com.oracle.svm.core.metadata.MetadataTracer;
4647
import com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils;
4748

@@ -59,9 +60,13 @@ public final class Target_java_lang_reflect_Constructor {
5960
@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = ParameterAnnotationsComputer.class)//
6061
byte[] parameterAnnotations;
6162

63+
/**
64+
* Value of the accessor when `this` is in the image heap. `null` for run-time constructed
65+
* constructors.
66+
*/
6267
@Alias //
6368
@RecomputeFieldValue(kind = Kind.Custom, declClass = ExecutableAccessorComputer.class) //
64-
Target_jdk_internal_reflect_ConstructorAccessor constructorAccessor;
69+
public Target_jdk_internal_reflect_ConstructorAccessor constructorAccessor;
6570

6671
/**
6772
* We need this indirection to use {@link #acquireConstructorAccessor()} for checking if
@@ -85,7 +90,10 @@ public Target_jdk_internal_reflect_ConstructorAccessor acquireConstructorAccesso
8590
if (MetadataTracer.enabled()) {
8691
ConstructorUtil.traceConstructorAccess(SubstrateUtil.cast(this, Executable.class));
8792
}
88-
if (constructorAccessorFromMetadata == null) {
93+
94+
RuntimeConditionSet conditions = SubstrateUtil.cast(this, Target_java_lang_reflect_AccessibleObject.class).conditions;
95+
assert constructorAccessor == null : "acquireConstructorAccessor() method must not be called if instance is in image heap.";
96+
if (constructorAccessorFromMetadata == null || !conditions.satisfied()) {
8997
throw MissingReflectionRegistrationUtils.reportInvokedExecutable(SubstrateUtil.cast(this, Executable.class));
9098
}
9199
return constructorAccessorFromMetadata;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public final class Target_java_lang_reflect_Method {
7575
@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = AnnotationDefaultComputer.class)//
7676
byte[] annotationDefault;
7777

78+
/**
79+
* Value of the accessor when `this` is in the image heap. `null` for run-time constructed
80+
* methods.
81+
*/
7882
@Alias //
7983
@RecomputeFieldValue(kind = Kind.Custom, declClass = ExecutableAccessorComputer.class) //
8084
public Target_jdk_internal_reflect_MethodAccessor methodAccessor;
@@ -140,6 +144,7 @@ public Target_jdk_internal_reflect_MethodAccessor acquireMethodAccessor() {
140144
if (MetadataTracer.enabled()) {
141145
MethodUtil.traceMethodAccess(SubstrateUtil.cast(this, Executable.class));
142146
}
147+
assert methodAccessor == null : "acquireMethodAccessor() method must not be called if `this` is in image heap.";
143148
if (methodAccessorFromMetadata == null || !conditions.satisfied()) {
144149
throw MissingReflectionRegistrationUtils.reportInvokedExecutable(SubstrateUtil.cast(this, Executable.class));
145150
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
import com.oracle.svm.core.annotate.TargetClass;
2828

2929
@TargetClass(className = "jdk.internal.reflect.ConstructorAccessor")
30-
final class Target_jdk_internal_reflect_ConstructorAccessor {
30+
public final class Target_jdk_internal_reflect_ConstructorAccessor {
3131
}

0 commit comments

Comments
 (0)