diff -r 309af3e40a0f -r 17a6bddcfa5d hotspot/src/share/vm/classfile/javaClasses.cpp --- a/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 02 15:17:11 2014 +0200 +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 02 15:22:18 2014 -0400 @@ -618,6 +618,8 @@ assert(comp_mirror.not_null(), "must have a mirror"); // Two-way link between the array klass and its component mirror: + // (array_klass) k -> mirror -> component_mirror -> array_klass -> k + set_component_mirror(mirror(), comp_mirror()); ArrayKlass::cast(k())->set_component_mirror(comp_mirror()); set_array_klass(comp_mirror(), k()); } else { @@ -679,6 +681,16 @@ java_class->obj_field_put(_protection_domain_offset, pd); } +void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) { + if (_component_mirror_offset != 0) { + java_class->obj_field_put(_component_mirror_offset, comp_mirror); + } +} +oop java_lang_Class::component_mirror(oop java_class) { + assert(_component_mirror_offset != 0, "must be set"); + return java_class->obj_field(_component_mirror_offset); +} + oop java_lang_Class::init_lock(oop java_class) { assert(_init_lock_offset != 0, "must be set"); return java_class->obj_field(_init_lock_offset); @@ -875,6 +887,10 @@ klass_oop, vmSymbols::classLoader_name(), vmSymbols::classloader_signature()); + compute_optional_offset(_component_mirror_offset, + klass_oop, vmSymbols::componentType_name(), + vmSymbols::class_signature()); + CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); } @@ -3097,6 +3113,7 @@ int java_lang_Class::_static_oop_field_count_offset; int java_lang_Class::_class_loader_offset; int java_lang_Class::_protection_domain_offset; +int java_lang_Class::_component_mirror_offset; int java_lang_Class::_init_lock_offset; int java_lang_Class::_signers_offset; GrowableArray* java_lang_Class::_fixup_mirror_list = NULL;