< 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 >