81 // super klass of an array, (j.l.Object) should not have 82 // any overpass methods present. 83 return super()->uncached_lookup_method(name, signature, Klass::skip_overpass, private_mode); 84 } 85 86 ArrayKlass::ArrayKlass(Symbol* name, KlassID id) : 87 Klass(id), 88 _dimension(1), 89 _higher_dimension(NULL), 90 _lower_dimension(NULL) { 91 // Arrays don't add any new methods, so their vtable is the same size as 92 // the vtable of klass Object. 93 set_vtable_length(Universe::base_vtable_size()); 94 set_name(name); 95 set_super(Universe::is_bootstrapping() ? NULL : SystemDictionary::Object_klass()); 96 set_layout_helper(Klass::_lh_neutral_value); 97 set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) 98 JFR_ONLY(INIT_ID(this);) 99 } 100 101 Symbol* ArrayKlass::create_element_klass_array_name(Klass* element_klass, TRAPS) { 102 Symbol* name = NULL; 103 if (!element_klass->is_instance_klass() || 104 (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) { 105 106 ResourceMark rm(THREAD); 107 char *name_str = element_klass->name()->as_C_string(); 108 int len = element_klass->name()->utf8_length(); 109 char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); 110 int idx = 0; 111 new_str[idx++] = '['; 112 if (element_klass->is_instance_klass()) { // it could be an array or simple type 113 // Temporary hack, for arrays of value types, this code should be removed 114 // once value types have their own array types 115 // With Q-descriptors, the code below needs to be reworked. 116 // It is still correct today because the only kind of value array supported 117 // is array of null-free values which map to the Q-signature. 118 // As soon as both arrays of null-free values and arrays of nullable values 119 // are supported, this code has to be rewritten to consider the kind of the 120 // array instead of the kind of the elements. 121 if (element_klass->is_value()) { 122 new_str[idx++] = 'Q'; 123 } else { 124 new_str[idx++] = 'L'; 125 } 126 } 127 memcpy(&new_str[idx], name_str, len * sizeof(char)); 128 idx += len; 129 if (element_klass->is_instance_klass()) { 130 new_str[idx++] = ';'; 131 } 132 new_str[idx++] = '\0'; 133 name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL); 134 if (element_klass->is_instance_klass() || element_klass->is_value()) { 135 InstanceKlass* ik = InstanceKlass::cast(element_klass); 136 ik->set_array_name(name); 137 } 138 } 139 140 return name; 141 } 142 143 // Initialization of vtables and mirror object is done separatly from base_create_array_klass, 144 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup. 145 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module_entry, TRAPS) { 146 k->initialize_supers(super_klass, NULL, CHECK); 147 k->vtable().initialize_vtable(false, CHECK); 148 149 // During bootstrapping, before java.base is defined, the module_entry may not be present yet. 150 // These classes will be put on a fixup list and their module fields will be patched once 151 // java.base is defined. 152 assert((module_entry != NULL) || ((module_entry == NULL) && !ModuleEntryTable::javabase_defined()), 153 "module entry not available post " JAVA_BASE_NAME " definition"); 154 oop module = (module_entry != NULL) ? module_entry->module() : (oop)NULL; 155 java_lang_Class::create_mirror(k, Handle(THREAD, k->class_loader()), Handle(THREAD, module), Handle(), CHECK); 156 } 157 158 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots, 159 Array<InstanceKlass*>* transitive_interfaces) { 160 // interfaces = { cloneable_klass, serializable_klass }; 161 assert(num_extra_slots == 0, "sanity of primitive array type"); 162 assert(transitive_interfaces == NULL, "sanity"); 163 // Must share this for correct bootstrapping! 164 set_secondary_supers(Universe::the_array_interfaces_array()); 165 return NULL; 166 } 167 168 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { 169 check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0); 170 int size = objArrayOopDesc::object_size(length); 171 Klass* k = array_klass(n+dimension(), CHECK_0); 172 ArrayKlass* ak = ArrayKlass::cast(k); 173 objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, 174 /* do_zero */ true, CHECK_0); 175 // initialization to NULL not necessary, area already cleared 176 return o; 177 } 178 179 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) { 180 Klass* k = this; 181 // Iterate over this array klass and all higher dimensions 182 while (k != NULL) { 183 f(k, CHECK); 184 k = ArrayKlass::cast(k)->higher_dimension(); 185 } 186 } 187 188 void ArrayKlass::array_klasses_do(void f(Klass* k)) { 189 Klass* k = this; 190 // Iterate over this array klass and all higher dimensions 191 while (k != NULL) { 192 f(k); 193 k = ArrayKlass::cast(k)->higher_dimension(); 194 } 195 } 196 197 // JVM support 198 199 jint ArrayKlass::compute_modifier_flags(TRAPS) const { 200 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 201 } 202 203 // JVMTI support 204 205 jint ArrayKlass::jvmti_class_status() const { | 81 // super klass of an array, (j.l.Object) should not have 82 // any overpass methods present. 83 return super()->uncached_lookup_method(name, signature, Klass::skip_overpass, private_mode); 84 } 85 86 ArrayKlass::ArrayKlass(Symbol* name, KlassID id) : 87 Klass(id), 88 _dimension(1), 89 _higher_dimension(NULL), 90 _lower_dimension(NULL) { 91 // Arrays don't add any new methods, so their vtable is the same size as 92 // the vtable of klass Object. 93 set_vtable_length(Universe::base_vtable_size()); 94 set_name(name); 95 set_super(Universe::is_bootstrapping() ? NULL : SystemDictionary::Object_klass()); 96 set_layout_helper(Klass::_lh_neutral_value); 97 set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) 98 JFR_ONLY(INIT_ID(this);) 99 } 100 101 Symbol* ArrayKlass::create_element_klass_array_name(bool is_qtype, Klass* element_klass, TRAPS) { 102 Symbol* name = NULL; 103 if (!element_klass->is_instance_klass() || is_qtype || 104 (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) { 105 106 ResourceMark rm(THREAD); 107 char *name_str = element_klass->name()->as_C_string(); 108 int len = element_klass->name()->utf8_length(); 109 char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); 110 int idx = 0; 111 new_str[idx++] = '['; 112 if (element_klass->is_instance_klass()) { // it could be an array or simple type 113 if (is_qtype) { 114 new_str[idx++] = 'Q'; 115 } else { 116 new_str[idx++] = 'L'; 117 } 118 } 119 memcpy(&new_str[idx], name_str, len * sizeof(char)); 120 idx += len; 121 if (element_klass->is_instance_klass()) { 122 new_str[idx++] = ';'; 123 } 124 new_str[idx++] = '\0'; 125 name = SymbolTable::new_permanent_symbol(new_str, CHECK_NULL); 126 if (element_klass->is_instance_klass() && (!is_qtype)) { 127 InstanceKlass* ik = InstanceKlass::cast(element_klass); 128 ik->set_array_name(name); // CMH: only cache and deref array_name for L-type...missing for Q-type 129 } 130 } 131 132 return name; 133 } 134 135 // Initialization of vtables and mirror object is done separatly from base_create_array_klass, 136 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup. 137 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module_entry, TRAPS) { 138 k->initialize_supers(super_klass, NULL, CHECK); 139 k->vtable().initialize_vtable(false, CHECK); 140 141 // During bootstrapping, before java.base is defined, the module_entry may not be present yet. 142 // These classes will be put on a fixup list and their module fields will be patched once 143 // java.base is defined. 144 assert((module_entry != NULL) || ((module_entry == NULL) && !ModuleEntryTable::javabase_defined()), 145 "module entry not available post " JAVA_BASE_NAME " definition"); 146 oop module = (module_entry != NULL) ? module_entry->module() : (oop)NULL; 147 java_lang_Class::create_mirror(k, Handle(THREAD, k->class_loader()), Handle(THREAD, module), Handle(), CHECK); 148 } 149 150 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots, 151 Array<InstanceKlass*>* transitive_interfaces) { 152 // interfaces = { cloneable_klass, serializable_klass }; 153 assert(num_extra_slots == 0, "sanity of primitive array type"); 154 assert(transitive_interfaces == NULL, "sanity"); 155 // Must share this for correct bootstrapping! 156 set_secondary_supers(Universe::the_array_interfaces_array()); 157 return NULL; 158 } 159 160 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { 161 check_array_allocation_length(length, arrayOopDesc::max_array_length(T_ARRAY), CHECK_0); 162 int size = objArrayOopDesc::object_size(length); 163 Klass* k = array_klass(FieldType::get_array_storage_properties(name()), n+dimension(), CHECK_0); 164 ArrayKlass* ak = ArrayKlass::cast(k); 165 objArrayOop o = (objArrayOop)Universe::heap()->array_allocate(ak, size, length, 166 /* do_zero */ true, CHECK_0); 167 // initialization to NULL not necessary, area already cleared 168 return o; 169 } 170 171 void ArrayKlass::array_klasses_do(void f(Klass* k)) { 172 Klass* k = this; 173 // Iterate over this array klass and all higher dimensions 174 while (k != NULL) { 175 f(k); 176 k = ArrayKlass::cast(k)->higher_dimension(); 177 } 178 } 179 180 // JVM support 181 182 jint ArrayKlass::compute_modifier_flags(TRAPS) const { 183 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; 184 } 185 186 // JVMTI support 187 188 jint ArrayKlass::jvmti_class_status() const { |