< prev index next >
src/hotspot/share/classfile/javaClasses.cpp
Print this page
rev 52849 : [mq]: q-mirror-reflection
rev 52850 : imported patch method-var-handles
*** 916,936 ****
--- 916,946 ----
// It might also have a component mirror. This mirror must already exist.
if (k->is_array_klass()) {
if (k->is_valueArray_klass()) {
Klass* element_klass = (Klass*) ValueArrayKlass::cast(k)->element_klass();
+ if (element_klass->is_value()) {
+ ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(element_klass));
+ comp_mirror = Handle(THREAD, vk->value_mirror());
+ } else {
comp_mirror = Handle(THREAD, element_klass->java_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));
+ comp_mirror = Handle(THREAD, vk->value_mirror());
+ } else {
comp_mirror = Handle(THREAD, element_klass->java_mirror());
}
+ }
assert(comp_mirror() != 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());
*** 965,980 ****
--- 975,1024 ----
if (comp_mirror() != NULL) {
// Set after k->java_mirror() is published, because compiled code running
// 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
// not affected.
class ResetMirrorField: public FieldClosure {
*** 1361,1370 ****
--- 1405,1434 ----
void java_lang_Class::set_module(oop java_class, oop module) {
assert(_module_offset != 0, "must be set");
java_class->obj_field_put(_module_offset, module);
}
+ 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)
oop java_class = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(NULL, CHECK_0);
if (type != T_VOID) {
*** 1445,1455 ****
if (!k->is_instance_klass()) {
name = k->name();
name->increment_refcount();
} else {
ResourceMark rm;
! const char* sigstr = k->signature_name();
int siglen = (int) strlen(sigstr);
if (!intern_if_not_found) {
name = SymbolTable::probe(sigstr, siglen);
} else {
name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
--- 1509,1525 ----
if (!k->is_instance_klass()) {
name = k->name();
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);
if (!intern_if_not_found) {
name = SymbolTable::probe(sigstr, siglen);
} else {
name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
*** 1546,1556 ****
#define CLASS_FIELDS_DO(macro) \
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)
void java_lang_Class::compute_offsets() {
if (offsets_computed) {
return;
}
--- 1616,1628 ----
#define CLASS_FIELDS_DO(macro) \
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(_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;
}
*** 4205,4214 ****
--- 4277,4288 ----
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;
GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
GrowableArray<Klass*>* java_lang_Class::_fixup_module_field_list = NULL;
int java_lang_Throwable::backtrace_offset;
< prev index next >