mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8255578: [JVMCI] be more careful about reflective reads of Class.componentType.
Reviewed-by: kvn, dlong
This commit is contained in:
parent
05bcd67e65
commit
bc6085b06c
3 changed files with 25 additions and 0 deletions
|
@ -322,6 +322,8 @@ class java_lang_Class : AllStatic {
|
||||||
static oop class_data(oop java_class);
|
static oop class_data(oop java_class);
|
||||||
static void set_class_data(oop java_class, oop classData);
|
static void set_class_data(oop java_class, oop classData);
|
||||||
|
|
||||||
|
static int component_mirror_offset() { return _component_mirror_offset; }
|
||||||
|
|
||||||
static oop class_loader(oop java_class);
|
static oop class_loader(oop java_class);
|
||||||
static void set_module(oop java_class, oop module);
|
static void set_module(oop java_class, oop module);
|
||||||
static oop module(oop java_class);
|
static oop module(oop java_class);
|
||||||
|
|
|
@ -1995,6 +1995,14 @@ C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object,
|
||||||
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
|
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
|
||||||
err_msg("Unexpected type: %s", JVMCIENV->klass_name(base)));
|
err_msg("Unexpected type: %s", JVMCIENV->klass_name(base)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(obj()) &&
|
||||||
|
!java_lang_Class::as_Klass(obj())->is_array_klass()) {
|
||||||
|
// Class.componentType for non-array classes can transiently contain an int[] that's
|
||||||
|
// used for locking so always return null to mimic Class.getComponentType()
|
||||||
|
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
|
||||||
|
}
|
||||||
|
|
||||||
jlong value = 0;
|
jlong value = 0;
|
||||||
JVMCIObject kind;
|
JVMCIObject kind;
|
||||||
switch (constant_type) {
|
switch (constant_type) {
|
||||||
|
@ -2220,6 +2228,13 @@ C2V_VMENTRY_NULL(jobject, getObject, (JNIEnv* env, jobject, jobject x, long disp
|
||||||
JVMCI_THROW_0(NullPointerException);
|
JVMCI_THROW_0(NullPointerException);
|
||||||
}
|
}
|
||||||
Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
|
Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
|
||||||
|
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(xobj()) &&
|
||||||
|
!java_lang_Class::as_Klass(xobj())->is_array_klass()) {
|
||||||
|
// Class.componentType for non-array classes can transiently contain an int[] that's
|
||||||
|
// used for locking so always return null to mimic Class.getComponentType()
|
||||||
|
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
|
||||||
|
}
|
||||||
|
|
||||||
oop res = xobj->obj_field(displacement);
|
oop res = xobj->obj_field(displacement);
|
||||||
JVMCIObject result = JVMCIENV->get_object_constant(res);
|
JVMCIObject result = JVMCIENV->get_object_constant(res);
|
||||||
return JVMCIENV->get_jobject(result);
|
return JVMCIENV->get_jobject(result);
|
||||||
|
|
|
@ -404,6 +404,14 @@ final class HotSpotJDKReflection extends HotSpotJVMCIReflection {
|
||||||
assert obj != null;
|
assert obj != null;
|
||||||
assert !field.isStatic() || obj instanceof Class;
|
assert !field.isStatic() || obj instanceof Class;
|
||||||
long displacement = field.getOffset();
|
long displacement = field.getOffset();
|
||||||
|
if (obj instanceof Class && field.getName().equals("componentType")) {
|
||||||
|
Class<?> clazz = (Class<?>) obj;
|
||||||
|
if (!clazz.isArray()) {
|
||||||
|
// Class.componentType for non-array classes can transiently contain an int[] that's
|
||||||
|
// used for locking so always return null to mimic Class.getComponentType()
|
||||||
|
return JavaConstant.NULL_POINTER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert checkRead(field.getJavaKind(), displacement,
|
assert checkRead(field.getJavaKind(), displacement,
|
||||||
(HotSpotResolvedObjectType) runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(field.isStatic() ? (Class<?>) obj : obj.getClass()),
|
(HotSpotResolvedObjectType) runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(field.isStatic() ? (Class<?>) obj : obj.getClass()),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue