--- 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<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;