@@ -2263,7 +2263,7 @@ C2V_VMENTRY_NULL(jobjectArray, getDeclaredFieldsInfo, (JNIEnv* env, jobject, ARG
2263
2263
InstanceKlass* iklass = InstanceKlass::cast(klass);
2264
2264
int java_fields, injected_fields;
2265
2265
GrowableArray<FieldInfo>* fields = FieldInfoStream::create_FieldInfoArray(iklass->fieldinfo_stream (), &java_fields, &injected_fields);
2266
- JVMCIObjectArray array = JVMCIENV->new_FieldInfo_array (fields->length (), JVMCIENV );
2266
+ JVMCIObjectArray array = JVMCIENV->new_FieldInfo_array (fields->length (), JVMCI_CHECK_NULL );
2267
2267
for (int i = 0 ; i < fields->length (); i++) {
2268
2268
JVMCIObject field_info = JVMCIENV->new_FieldInfo (fields->adr_at (i), JVMCI_CHECK_NULL);
2269
2269
JVMCIENV->put_object_at (array, i, field_info);
@@ -2876,11 +2876,12 @@ C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle, jbool
2876
2876
JVMCIObject methodObject = thisEnv->get_HotSpotNmethod_method (obj);
2877
2877
methodHandle mh (THREAD, thisEnv->asMethod (methodObject));
2878
2878
jboolean isDefault = thisEnv->get_HotSpotNmethod_isDefault (obj);
2879
+ jboolean profileDeopt = thisEnv->get_HotSpotNmethod_profileDeopt (obj);
2879
2880
jlong compileIdSnapshot = thisEnv->get_HotSpotNmethod_compileIdSnapshot (obj);
2880
2881
JVMCIObject name_string = thisEnv->get_InstalledCode_name (obj);
2881
2882
const char * cstring = name_string.is_null () ? nullptr : thisEnv->as_utf8_string (name_string);
2882
2883
// Create a new HotSpotNmethod instance in the peer runtime
2883
- result = PEER_JVMCIENV->new_HotSpotNmethod (mh, cstring, isDefault, compileIdSnapshot, JVMCI_CHECK_0);
2884
+ result = PEER_JVMCIENV->new_HotSpotNmethod (mh, cstring, isDefault, profileDeopt, compileIdSnapshot, JVMCI_CHECK_0);
2884
2885
JVMCINMethodHandle nmethod_handle (THREAD);
2885
2886
nmethod* nm = JVMCIENV->get_nmethod (obj, nmethod_handle);
2886
2887
if (result.is_null ()) {
@@ -2969,13 +2970,21 @@ C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, ARGUMEN
2969
2970
return JNIHandles::make_local(THREAD, executable);
2970
2971
C2V_END
2971
2972
2973
+ // Checks that `index` denotes a non-injected field in `klass`
2972
2974
static InstanceKlass* check_field (Klass* klass, jint index, JVMCI_TRAPS) {
2973
2975
if (!klass->is_instance_klass ()) {
2974
2976
JVMCI_THROW_MSG_NULL (IllegalArgumentException,
2975
2977
err_msg (" Expected non-primitive type, got %s" , klass->external_name ()));
2976
2978
}
2977
2979
InstanceKlass* iklass = InstanceKlass::cast (klass);
2978
- if (index < 0 || index > iklass->total_fields_count ()) {
2980
+ if (index < 0 || index >= iklass->java_fields_count ()) {
2981
+ if (index >= 0 && index < iklass->total_fields_count ()) {
2982
+ fieldDescriptor fd (iklass, index);
2983
+ if (fd.is_injected ()) {
2984
+ JVMCI_THROW_MSG_NULL (IllegalArgumentException,
2985
+ err_msg (" Cannot get Field for injected %s.%s" , klass->external_name (), fd.name ()->as_C_string ()));
2986
+ }
2987
+ }
2979
2988
JVMCI_THROW_MSG_NULL (IllegalArgumentException,
2980
2989
err_msg (" Field index %d out of bounds for %s" , index, klass->external_name ()));
2981
2990
}
@@ -2985,15 +2994,15 @@ static InstanceKlass* check_field(Klass* klass, jint index, JVMCI_TRAPS) {
2985
2994
C2V_VMENTRY_NULL (jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index))
2986
2995
requireInHotSpot(" asReflectionField" , JVMCI_CHECK_NULL);
2987
2996
Klass* klass = UNPACK_PAIR(Klass, klass);
2988
- InstanceKlass* iklass = check_field(klass, index, JVMCIENV );
2997
+ InstanceKlass* iklass = check_field(klass, index, JVMCI_CHECK_NULL );
2989
2998
fieldDescriptor fd (iklass, index);
2990
2999
oop reflected = Reflection::new_field(&fd, CHECK_NULL);
2991
3000
return JNIHandles::make_local(THREAD, reflected);
2992
3001
C2V_END
2993
3002
2994
3003
static jbyteArray get_encoded_annotation_data (InstanceKlass* holder, AnnotationArray* annotations_array, bool for_class,
2995
3004
jint filter_length, jlong filter_klass_pointers,
2996
- JavaThread* THREAD, JVMCIEnv* JVMCIENV ) {
3005
+ JavaThread* THREAD, JVMCI_TRAPS ) {
2997
3006
// Get a ConstantPool object for annotation parsing
2998
3007
Handle jcp = reflect_ConstantPool::create (CHECK_NULL);
2999
3008
reflect_ConstantPool::set_cp (jcp (), holder->constants ());
@@ -3071,7 +3080,7 @@ C2V_END
3071
3080
C2V_VMENTRY_NULL (jbyteArray, getEncodedFieldAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index,
3072
3081
jobject filter, jint filter_length, jlong filter_klass_pointers))
3073
3082
CompilerThreadCanCallJava canCallJava(thread, true ); // Requires Java support
3074
- InstanceKlass* holder = check_field(InstanceKlass::cast(UNPACK_PAIR(Klass, klass)), index, JVMCIENV );
3083
+ InstanceKlass* holder = check_field(InstanceKlass::cast(UNPACK_PAIR(Klass, klass)), index, JVMCI_CHECK_NULL );
3075
3084
fieldDescriptor fd (holder, index);
3076
3085
return get_encoded_annotation_data(holder, fd.annotations(), false , filter_length, filter_klass_pointers, THREAD, JVMCIENV);
3077
3086
C2V_END
0 commit comments