Skip to content

Commit ef950cc

Browse files
committed
[GR-15364] Support Method.getDefaultValue().
PullRequest: graal/3439
2 parents 1a68d88 + 302344f commit ef950cc

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

substratevm/src/com.oracle.svm.reflect/src/com/oracle/svm/reflect/target/ReflectionHelper.java

+13
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ static Target_java_lang_reflect_Executable getHolder(Target_java_lang_reflect_Ex
3838
return holder;
3939
}
4040

41+
static Target_java_lang_reflect_Method getHolder(Target_java_lang_reflect_Method method) {
42+
Target_java_lang_reflect_Method holder = asMethod(getRoot(asExecutable(method)));
43+
if (holder == null) {
44+
holder = method;
45+
}
46+
47+
return holder;
48+
}
49+
4150
static Target_java_lang_reflect_Constructor getHolder(Target_java_lang_reflect_Constructor constructor) {
4251
Target_java_lang_reflect_Constructor holder = asConstructor(getRoot(asExecutable(constructor)));
4352
if (holder == null) {
@@ -63,6 +72,10 @@ static <T> T requireNonNull(T object, String errorMessage) {
6372
return object;
6473
}
6574

75+
private static Target_java_lang_reflect_Method asMethod(Target_java_lang_reflect_Executable executable) {
76+
return KnownIntrinsics.unsafeCast(executable, Target_java_lang_reflect_Method.class);
77+
}
78+
6679
private static Target_java_lang_reflect_Constructor asConstructor(Target_java_lang_reflect_Executable executable) {
6780
return KnownIntrinsics.unsafeCast(executable, Target_java_lang_reflect_Constructor.class);
6881
}

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

+23
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,17 @@
2929
import java.lang.reflect.Method;
3030

3131
import com.oracle.svm.core.annotate.Alias;
32+
import com.oracle.svm.core.annotate.Inject;
3233
import com.oracle.svm.core.annotate.RecomputeFieldValue;
34+
import com.oracle.svm.core.annotate.RecomputeFieldValue.CustomFieldValueComputer;
3335
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
3436
import com.oracle.svm.core.annotate.Substitute;
3537
import com.oracle.svm.core.annotate.TargetClass;
3638
import com.oracle.svm.core.util.VMError;
3739
import com.oracle.svm.reflect.hosted.AccessorComputer;
3840

41+
import jdk.vm.ci.meta.MetaAccessProvider;
42+
import jdk.vm.ci.meta.ResolvedJavaField;
3943
import sun.reflect.generics.repository.MethodRepository;
4044

4145
@TargetClass(value = Method.class)
@@ -47,6 +51,9 @@ public final class Target_java_lang_reflect_Method {
4751
@RecomputeFieldValue(kind = Kind.Custom, declClass = AccessorComputer.class) //
4852
Target_jdk_internal_reflect_MethodAccessor methodAccessor;
4953

54+
@Inject @RecomputeFieldValue(kind = Kind.Custom, declClass = DefaultValueComputer.class) //
55+
Object defaultValue;
56+
5057
@Alias
5158
native Target_java_lang_reflect_Method copy();
5259

@@ -57,4 +64,20 @@ Target_jdk_internal_reflect_MethodAccessor acquireMethodAccessor() {
5764
}
5865
return methodAccessor;
5966
}
67+
68+
@Substitute
69+
public Object getDefaultValue() {
70+
Target_java_lang_reflect_Method holder = ReflectionHelper.getHolder(this);
71+
return holder.defaultValue;
72+
}
73+
74+
public static final class DefaultValueComputer implements CustomFieldValueComputer {
75+
76+
@Override
77+
public Object compute(MetaAccessProvider metaAccess, ResolvedJavaField original, ResolvedJavaField annotated, Object receiver) {
78+
Method method = (Method) receiver;
79+
return method.getDefaultValue();
80+
}
81+
}
82+
6083
}

0 commit comments

Comments
 (0)