Skip to content

Commit 3d953da

Browse files
author
duke
committed
Automatic merge of jdk:master into master
2 parents 42822bc + bc6085b commit 3d953da

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

src/hotspot/share/classfile/javaClasses.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ class java_lang_Class : AllStatic {
322322
static oop class_data(oop java_class);
323323
static void set_class_data(oop java_class, oop classData);
324324

325+
static int component_mirror_offset() { return _component_mirror_offset; }
326+
325327
static oop class_loader(oop java_class);
326328
static void set_module(oop java_class, oop module);
327329
static oop module(oop java_class);

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,6 +1995,14 @@ C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object,
19951995
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
19961996
err_msg("Unexpected type: %s", JVMCIENV->klass_name(base)));
19971997
}
1998+
1999+
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(obj()) &&
2000+
!java_lang_Class::as_Klass(obj())->is_array_klass()) {
2001+
// Class.componentType for non-array classes can transiently contain an int[] that's
2002+
// used for locking so always return null to mimic Class.getComponentType()
2003+
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
2004+
}
2005+
19982006
jlong value = 0;
19992007
JVMCIObject kind;
20002008
switch (constant_type) {
@@ -2220,6 +2228,13 @@ C2V_VMENTRY_NULL(jobject, getObject, (JNIEnv* env, jobject, jobject x, long disp
22202228
JVMCI_THROW_0(NullPointerException);
22212229
}
22222230
Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
2231+
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(xobj()) &&
2232+
!java_lang_Class::as_Klass(xobj())->is_array_klass()) {
2233+
// Class.componentType for non-array classes can transiently contain an int[] that's
2234+
// used for locking so always return null to mimic Class.getComponentType()
2235+
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
2236+
}
2237+
22232238
oop res = xobj->obj_field(displacement);
22242239
JVMCIObject result = JVMCIENV->get_object_constant(res);
22252240
return JVMCIENV->get_jobject(result);

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJDKReflection.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,14 @@ JavaConstant readFieldValue(HotSpotResolvedJavaField field, Object obj, boolean
404404
assert obj != null;
405405
assert !field.isStatic() || obj instanceof Class;
406406
long displacement = field.getOffset();
407+
if (obj instanceof Class && field.getName().equals("componentType")) {
408+
Class<?> clazz = (Class<?>) obj;
409+
if (!clazz.isArray()) {
410+
// Class.componentType for non-array classes can transiently contain an int[] that's
411+
// used for locking so always return null to mimic Class.getComponentType()
412+
return JavaConstant.NULL_POINTER;
413+
}
414+
}
407415

408416
assert checkRead(field.getJavaKind(), displacement,
409417
(HotSpotResolvedObjectType) runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(field.isStatic() ? (Class<?>) obj : obj.getClass()),

0 commit comments

Comments
 (0)