--- old/src/hotspot/share/classfile/javaClasses.cpp 2019-05-15 13:57:16.123598601 -0400 +++ new/src/hotspot/share/classfile/javaClasses.cpp 2019-05-15 13:57:15.707596538 -0400 @@ -928,17 +928,19 @@ assert(element_klass->is_value(), "Must be value type component"); ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass)); comp_mirror = Handle(THREAD, vk->value_mirror()); - } - else if (k->is_typeArray_klass()) { + } else if (k->is_typeArray_klass()) { BasicType type = TypeArrayKlass::cast(k)->element_type(); comp_mirror = Handle(THREAD, Universe::java_mirror(type)); } else { assert(k->is_objArray_klass(), "Must be"); Klass* element_klass = ObjArrayKlass::cast(k)->element_klass(); assert(element_klass != NULL, "Must have an element klass"); - if (element_klass->is_value() && k->name()->is_Q_array_signature()) { + if (element_klass->is_value()) { ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass)); - comp_mirror = Handle(THREAD, vk->value_mirror()); + assert(vk->java_mirror() == vk->value_mirror(), "primary mirror is the value mirror"); + assert(vk->nullable_mirror() != NULL, "must have a nullable class mirror"); + comp_mirror = k->name()->is_Q_array_signature() ? Handle(THREAD, vk->value_mirror()) + : Handle(THREAD, vk->nullable_mirror()); } else { comp_mirror = Handle(THREAD, element_klass->java_mirror()); } @@ -983,10 +985,10 @@ } if (k->is_value()) { - // create the secondary mirror for value class - oop value_mirror_oop = create_value_mirror(k, mirror, CHECK); - set_box_mirror(mirror(), mirror()); - set_value_mirror(mirror(), value_mirror_oop); + // create the secondary mirror for an inline class + oop nullable_mirror_oop = create_nullable_inline_type_mirror(k, mirror, CHECK); + set_inline_type_mirror(mirror(), mirror()); + set_nullable_type_mirror(mirror(), nullable_mirror_oop); } } else { assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized"); @@ -994,31 +996,26 @@ } } -// Create the secondary mirror for value type. Sets all the fields of this java.lang.Class -// instance with the same value as the primary mirror except signers. -// Class::setSigners and getSigners will use the primary mirror when passed to the JVM. -oop java_lang_Class::create_value_mirror(Klass* k, Handle mirror, TRAPS) { - // Allocate mirror (java.lang.Class instance) - oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); - Handle value_mirror(THREAD, mirror_oop); - - java_lang_Class::set_klass(value_mirror(), k); - java_lang_Class::set_static_oop_field_count(value_mirror(), static_oop_field_count(mirror())); - // ## do we need to set init lock? - java_lang_Class::set_init_lock(value_mirror(), init_lock(mirror())); - - if (k->is_array_klass()) { - assert(component_mirror(mirror()) != NULL, "must have a mirror"); - set_component_mirror(value_mirror(), component_mirror(mirror())); - } - - set_protection_domain(value_mirror(), protection_domain(mirror())); - set_class_loader(value_mirror(), class_loader(mirror())); - // ## handle if java.base is not yet defined - set_module(value_mirror(), module(mirror())); - set_box_mirror(value_mirror(), mirror()); - set_value_mirror(value_mirror(), value_mirror()); - return value_mirror(); +// Create the secondary mirror for inline class. Sets all the fields of this java.lang.Class +// instance with the same value as the primary mirror +oop java_lang_Class::create_nullable_inline_type_mirror(Klass* k, Handle mirror, TRAPS) { + assert(k->is_value(), "inline class"); + // Allocate mirror (java.lang.Class instance) + oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); + Handle nullable_mirror(THREAD, mirror_oop); + + java_lang_Class::set_klass(nullable_mirror(), k); + java_lang_Class::set_static_oop_field_count(nullable_mirror(), static_oop_field_count(mirror())); + // ## do we need to set init lock? + java_lang_Class::set_init_lock(nullable_mirror(), init_lock(mirror())); + + set_protection_domain(nullable_mirror(), protection_domain(mirror())); + set_class_loader(nullable_mirror(), class_loader(mirror())); + // ## handle if java.base is not yet defined + set_module(nullable_mirror(), module(mirror())); + set_inline_type_mirror(nullable_mirror(), mirror()); + set_nullable_type_mirror(nullable_mirror(), nullable_mirror()); + return nullable_mirror(); } #if INCLUDE_CDS_JAVA_HEAP @@ -1428,24 +1425,24 @@ java_class->obj_field_put(_source_file_offset, source_file); } -oop java_lang_Class::value_mirror(oop java_class) { - assert(_value_mirror_offset != 0, "must be set"); - return java_class->obj_field(_value_mirror_offset); +oop java_lang_Class::inline_type_mirror(oop java_class) { + assert(_inline_mirror_offset != 0, "must be set"); + return java_class->obj_field(_inline_mirror_offset); } -void java_lang_Class::set_value_mirror(oop java_class, oop mirror) { - assert(_value_mirror_offset != 0, "must be set"); - java_class->obj_field_put(_value_mirror_offset, mirror); +void java_lang_Class::set_inline_type_mirror(oop java_class, oop mirror) { + assert(_inline_mirror_offset != 0, "must be set"); + java_class->obj_field_put(_inline_mirror_offset, mirror); } -oop java_lang_Class::box_mirror(oop java_class) { - assert(_box_mirror_offset != 0, "must be set"); - return java_class->obj_field(_box_mirror_offset); +oop java_lang_Class::nullable_type_mirror(oop java_class) { + assert(_nullable_mirror_offset != 0, "must be set"); + return java_class->obj_field(_nullable_mirror_offset); } -void java_lang_Class::set_box_mirror(oop java_class, oop mirror) { - assert(_box_mirror_offset != 0, "must be set"); - java_class->obj_field_put(_box_mirror_offset, mirror); +void java_lang_Class::set_nullable_type_mirror(oop java_class, oop mirror) { + assert(_nullable_mirror_offset != 0, "must be set"); + java_class->obj_field_put(_nullable_mirror_offset, mirror); } oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) { @@ -1506,7 +1503,7 @@ return; } if (is_instance) { - if (is_value && (java_class == value_mirror(java_class))) { + if (is_value && (java_class == inline_type_mirror(java_class))) { st->print("Q"); } else { st->print("L"); @@ -1534,7 +1531,7 @@ ResourceMark rm; const char* sigstr; if (k->is_value()) { - char c = (java_class == value_mirror(java_class)) ? 'Q' : 'L'; + char c = (java_class == inline_type_mirror(java_class)) ? 'Q' : 'L'; sigstr = InstanceKlass::cast(k)->signature_name_of(c); } else { sigstr = k->signature_name(); @@ -1624,8 +1621,8 @@ macro(_component_mirror_offset, k, "componentType", class_signature, false); \ macro(_module_offset, k, "module", module_signature, false); \ macro(_name_offset, k, "name", string_signature, false); \ - macro(_box_mirror_offset, k, "boxType", class_signature, false); \ - macro(_value_mirror_offset, k, "valueType", class_signature, false); \ + macro(_inline_mirror_offset, k, "inlineType", class_signature, false); \ + macro(_nullable_mirror_offset, k, "nullableType", class_signature, false); \ void java_lang_Class::compute_offsets() { if (offsets_computed) { @@ -4145,8 +4142,8 @@ int java_lang_Class::_module_offset; int java_lang_Class::_protection_domain_offset; int java_lang_Class::_component_mirror_offset; -int java_lang_Class::_box_mirror_offset; -int java_lang_Class::_value_mirror_offset; +int java_lang_Class::_inline_mirror_offset; +int java_lang_Class::_nullable_mirror_offset; int java_lang_Class::_init_lock_offset; int java_lang_Class::_signers_offset; int java_lang_Class::_name_offset;