< prev index next >

src/hotspot/share/oops/arrayKlass.cpp

Print this page

        

*** 96,126 **** set_layout_helper(Klass::_lh_neutral_value); set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) JFR_ONLY(INIT_ID(this);) } ! Symbol* ArrayKlass::create_element_klass_array_name(Klass* element_klass, TRAPS) { Symbol* name = NULL; ! if (!element_klass->is_instance_klass() || (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) { ResourceMark rm(THREAD); char *name_str = element_klass->name()->as_C_string(); int len = element_klass->name()->utf8_length(); char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); int idx = 0; new_str[idx++] = '['; if (element_klass->is_instance_klass()) { // it could be an array or simple type ! // Temporary hack, for arrays of value types, this code should be removed ! // once value types have their own array types ! // With Q-descriptors, the code below needs to be reworked. ! // It is still correct today because the only kind of value array supported ! // is array of null-free values which map to the Q-signature. ! // As soon as both arrays of null-free values and arrays of nullable values ! // are supported, this code has to be rewritten to consider the kind of the ! // array instead of the kind of the elements. ! if (element_klass->is_value()) { new_str[idx++] = 'Q'; } else { new_str[idx++] = 'L'; } } --- 96,118 ---- set_layout_helper(Klass::_lh_neutral_value); set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) JFR_ONLY(INIT_ID(this);) } ! Symbol* ArrayKlass::create_element_klass_array_name(bool is_qtype, Klass* element_klass, TRAPS) { Symbol* name = NULL; ! if (!element_klass->is_instance_klass() || is_qtype || (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) { ResourceMark rm(THREAD); char *name_str = element_klass->name()->as_C_string(); int len = element_klass->name()->utf8_length(); char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); int idx = 0; new_str[idx++] = '['; if (element_klass->is_instance_klass()) { // it could be an array or simple type ! if (is_qtype) { new_str[idx++] = 'Q'; } else { new_str[idx++] = 'L'; } }
*** 129,141 **** if (element_klass->is_instance_klass()) { new_str[idx++] = ';'; } new_str[idx++] = '\0'; name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL); ! if (element_klass->is_instance_klass() || element_klass->is_value()) { InstanceKlass* ik = InstanceKlass::cast(element_klass); ! ik->set_array_name(name); } } return name; } --- 121,133 ---- if (element_klass->is_instance_klass()) { new_str[idx++] = ';'; } new_str[idx++] = '\0'; name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL); ! if (element_klass->is_instance_klass() && (!is_qtype)) { InstanceKlass* ik = InstanceKlass::cast(element_klass); ! ik->set_array_name(name); // CMH: only cache and deref array_name for L-type...missing for Q-type } } return name; }
*** 166,192 **** } objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0); int size = objArrayOopDesc::object_size(length); ! Klass* k = array_klass(n+dimension(), CHECK_0); ArrayKlass* ak = ArrayKlass::cast(k); objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, /* do_zero */ true, CHECK_0); // initialization to NULL not necessary, area already cleared return o; } - void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) { - Klass* k = this; - // Iterate over this array klass and all higher dimensions - while (k != NULL) { - f(k, CHECK); - k = ArrayKlass::cast(k)->higher_dimension(); - } - } - void ArrayKlass::array_klasses_do(void f(Klass* k)) { Klass* k = this; // Iterate over this array klass and all higher dimensions while (k != NULL) { f(k); --- 158,175 ---- } objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0); int size = objArrayOopDesc::object_size(length); ! Klass* k = array_klass(FieldType::get_array_storage_properties(name()), n+dimension(), CHECK_0); ArrayKlass* ak = ArrayKlass::cast(k); objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, /* do_zero */ true, CHECK_0); // initialization to NULL not necessary, area already cleared return o; } void ArrayKlass::array_klasses_do(void f(Klass* k)) { Klass* k = this; // Iterate over this array klass and all higher dimensions while (k != NULL) { f(k);
< prev index next >