Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Constructor;
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Field;
import com.oracle.svm.core.reflect.target.Target_java_lang_reflect_Method;
import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_ConstructorAccessor;
import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_MethodAccessor;
import com.oracle.svm.core.util.VMError;

Expand Down Expand Up @@ -280,8 +281,12 @@ private static SubstrateConstructorAccessor asConstructor(Target_java_lang_invok
return getConstructorAccessor(constructor);
}

@SuppressWarnings("DataFlowIssue")
private static SubstrateConstructorAccessor getConstructorAccessor(Constructor<?> constructor) {
return SubstrateUtil.cast(SubstrateUtil.cast(constructor, Target_java_lang_reflect_Constructor.class).acquireConstructorAccessor(), SubstrateConstructorAccessor.class);
Target_java_lang_reflect_Constructor internalConstructor = SubstrateUtil.cast(constructor, Target_java_lang_reflect_Constructor.class);
Target_jdk_internal_reflect_ConstructorAccessor constructorAccessor = internalConstructor.constructorAccessor;
var result = constructorAccessor == null ? internalConstructor.acquireConstructorAccessor() : constructorAccessor;
return SubstrateUtil.cast(result, SubstrateConstructorAccessor.class);
}

private static <T extends AccessibleObject & Member> void checkMember(T member, boolean isStatic) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;
import com.oracle.svm.core.annotate.TargetElement;
import com.oracle.svm.core.configure.RuntimeConditionSet;
import com.oracle.svm.core.metadata.MetadataTracer;
import com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils;

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

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

/**
* We need this indirection to use {@link #acquireConstructorAccessor()} for checking if
Expand All @@ -85,7 +90,10 @@ public Target_jdk_internal_reflect_ConstructorAccessor acquireConstructorAccesso
if (MetadataTracer.enabled()) {
ConstructorUtil.traceConstructorAccess(SubstrateUtil.cast(this, Executable.class));
}
if (constructorAccessorFromMetadata == null) {

RuntimeConditionSet conditions = SubstrateUtil.cast(this, Target_java_lang_reflect_AccessibleObject.class).conditions;
assert constructorAccessor == null : "acquireConstructorAccessor() method must not be called if instance is in image heap.";
if (constructorAccessorFromMetadata == null || !conditions.satisfied()) {
throw MissingReflectionRegistrationUtils.reportInvokedExecutable(SubstrateUtil.cast(this, Executable.class));
}
return constructorAccessorFromMetadata;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ public final class Target_java_lang_reflect_Method {
@Alias @RecomputeFieldValue(kind = Kind.Custom, declClass = AnnotationDefaultComputer.class)//
byte[] annotationDefault;

/**
* Value of the accessor when `this` is in the image heap. `null` for run-time constructed
* methods.
*/
@Alias //
@RecomputeFieldValue(kind = Kind.Custom, declClass = ExecutableAccessorComputer.class) //
public Target_jdk_internal_reflect_MethodAccessor methodAccessor;
Expand Down Expand Up @@ -140,6 +144,7 @@ public Target_jdk_internal_reflect_MethodAccessor acquireMethodAccessor() {
if (MetadataTracer.enabled()) {
MethodUtil.traceMethodAccess(SubstrateUtil.cast(this, Executable.class));
}
assert methodAccessor == null : "acquireMethodAccessor() method must not be called if `this` is in image heap.";
if (methodAccessorFromMetadata == null || !conditions.satisfied()) {
throw MissingReflectionRegistrationUtils.reportInvokedExecutable(SubstrateUtil.cast(this, Executable.class));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "jdk.internal.reflect.ConstructorAccessor")
final class Target_jdk_internal_reflect_ConstructorAccessor {
public final class Target_jdk_internal_reflect_ConstructorAccessor {
}