< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page
rev 55127 : 8223351: [lworld] Primary mirror and nullable mirror for inline type
Reviewed-by: tbd

*** 926,946 **** if (k->is_valueArray_klass()) { Klass* element_klass = (Klass*) ValueArrayKlass::cast(k)->element_klass(); 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()) { 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()) { ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass)); ! comp_mirror = Handle(THREAD, vk->value_mirror()); } else { comp_mirror = Handle(THREAD, element_klass->java_mirror()); } } assert(comp_mirror() != NULL, "must have a mirror"); --- 926,948 ---- if (k->is_valueArray_klass()) { Klass* element_klass = (Klass*) ValueArrayKlass::cast(k)->element_klass(); 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()) { 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()) { ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass)); ! 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()); } } assert(comp_mirror() != NULL, "must have a mirror");
*** 981,1026 **** // concurrently doesn't expect a k to have a null java_mirror. release_set_array_klass(comp_mirror(), k); } 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); } } else { assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized"); fixup_mirror_list()->push(k); } } ! // 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(); } #if INCLUDE_CDS_JAVA_HEAP // Clears mirror fields. Static final fields with initial values are reloaded // from constant pool. The object identity hash is in the object header and is --- 983,1023 ---- // concurrently doesn't expect a k to have a null java_mirror. release_set_array_klass(comp_mirror(), k); } if (k->is_value()) { ! // 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"); fixup_mirror_list()->push(k); } } ! // 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 // Clears mirror fields. Static final fields with initial values are reloaded // from constant pool. The object identity hash is in the object header and is
*** 1426,1453 **** void java_lang_Class::set_source_file(oop java_class, oop source_file) { assert(_source_file_offset != 0, "must be set"); 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); } ! 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); } ! 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); } ! 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); } oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) { // This should be improved by adding a field at the Java level or by // introducing a new VM klass (see comment in ClassFileParser) --- 1423,1450 ---- void java_lang_Class::set_source_file(oop java_class, oop source_file) { assert(_source_file_offset != 0, "must be set"); java_class->obj_field_put(_source_file_offset, source_file); } ! 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_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::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_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) { // This should be improved by adding a field at the Java level or by // introducing a new VM klass (see comment in ClassFileParser)
*** 1504,1514 **** if (name == NULL) { st->print("<null>"); return; } if (is_instance) { ! if (is_value && (java_class == value_mirror(java_class))) { st->print("Q"); } else { st->print("L"); } } --- 1501,1511 ---- if (name == NULL) { st->print("<null>"); return; } if (is_instance) { ! if (is_value && (java_class == inline_type_mirror(java_class))) { st->print("Q"); } else { st->print("L"); } }
*** 1532,1542 **** name->increment_refcount(); } else { ResourceMark rm; const char* sigstr; if (k->is_value()) { ! char c = (java_class == value_mirror(java_class)) ? 'Q' : 'L'; sigstr = InstanceKlass::cast(k)->signature_name_of(c); } else { sigstr = k->signature_name(); } int siglen = (int) strlen(sigstr); --- 1529,1539 ---- name->increment_refcount(); } else { ResourceMark rm; const char* sigstr; if (k->is_value()) { ! char c = (java_class == inline_type_mirror(java_class)) ? 'Q' : 'L'; sigstr = InstanceKlass::cast(k)->signature_name_of(c); } else { sigstr = k->signature_name(); } int siglen = (int) strlen(sigstr);
*** 1622,1633 **** macro(classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false) ; \ macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \ 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); \ void java_lang_Class::compute_offsets() { if (offsets_computed) { return; } --- 1619,1630 ---- macro(classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false) ; \ macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \ 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(_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) { return; }
*** 4143,4154 **** int java_lang_Class::_static_oop_field_count_offset; int java_lang_Class::_class_loader_offset; 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::_init_lock_offset; int java_lang_Class::_signers_offset; int java_lang_Class::_name_offset; int java_lang_Class::_source_file_offset; GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL; --- 4140,4151 ---- int java_lang_Class::_static_oop_field_count_offset; int java_lang_Class::_class_loader_offset; int java_lang_Class::_module_offset; int java_lang_Class::_protection_domain_offset; int java_lang_Class::_component_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; int java_lang_Class::_source_file_offset; GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
< prev index next >