81 { 82 MutexUnlocker mu(MultiArray_lock); 83 super_klass = element_super->array_klass(CHECK_NULL); 84 for( int i = element_supers->length()-1; i >= 0; i-- ) { 85 Klass* elem_super = element_supers->at(i); 86 elem_super->array_klass(CHECK_NULL); 87 } 88 // Now retry from the beginning 89 ek = element_klass->array_klass(n, CHECK_NULL); 90 } // re-lock 91 return ek; 92 } 93 } else { 94 // The element type is already Object. Object[] has direct super of Object. 95 super_klass = SystemDictionary::Object_klass(); 96 } 97 } 98 99 // Create type name for klass. 100 Symbol* name = NULL; 101 if (!element_klass->is_instance_klass() || 102 (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) { 103 104 ResourceMark rm(THREAD); 105 char *name_str = element_klass->name()->as_C_string(); 106 int len = element_klass->name()->utf8_length(); 107 char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); 108 int idx = 0; 109 new_str[idx++] = JVM_SIGNATURE_ARRAY; 110 if (element_klass->is_instance_klass()) { // it could be an array or simple type 111 new_str[idx++] = JVM_SIGNATURE_CLASS; 112 } 113 memcpy(&new_str[idx], name_str, len * sizeof(char)); 114 idx += len; 115 if (element_klass->is_instance_klass()) { 116 new_str[idx++] = JVM_SIGNATURE_ENDCLASS; 117 } 118 new_str[idx++] = '\0'; 119 name = SymbolTable::new_permanent_symbol(new_str); 120 if (element_klass->is_instance_klass()) { 121 InstanceKlass* ik = InstanceKlass::cast(element_klass); 122 ik->set_array_name(name); 123 } 124 } 125 126 // Initialize instance variables 127 ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_NULL); 128 129 ModuleEntry* module = oak->module(); 130 assert(module != NULL, "No module entry for array"); 131 132 // Call complete_create_array_klass after all instance variables has been initialized. 133 ArrayKlass::complete_create_array_klass(oak, super_klass, module, CHECK_NULL); 134 135 // Add all classes to our internal class loader list here, 136 // including classes in the bootstrap (NULL) class loader. 137 // Do this step after creating the mirror so that if the 138 // mirror creation fails, loaded_classes_do() doesn't find 139 // an array class without a mirror. 140 loader_data->add_class(oak); 141 142 return oak; 143 } 144 145 ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name, ID) { 146 this->set_dimension(n); 147 this->set_element_klass(element_klass); 148 // decrement refcount because object arrays are not explicitly freed. The 149 // InstanceKlass array_name() keeps the name counted while the klass is 150 // loaded. 151 name->decrement_refcount(); 152 153 Klass* bk; 154 if (element_klass->is_objArray_klass()) { 155 bk = ObjArrayKlass::cast(element_klass)->bottom_klass(); 156 } else { 157 bk = element_klass; 158 } 159 assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass"); 160 this->set_bottom_klass(bk); 161 this->set_class_loader_data(bk->class_loader_data()); 162 163 this->set_layout_helper(array_layout_helper(T_OBJECT)); 164 assert(this->is_array_klass(), "sanity"); 165 assert(this->is_objArray_klass(), "sanity"); 166 } 167 168 int ObjArrayKlass::oop_size(oop obj) const { 169 assert(obj->is_objArray(), "must be object array"); 170 return objArrayOop(obj)->object_size(); 171 } 172 173 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) { 174 check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL); 175 int size = objArrayOopDesc::object_size(length); 176 return (objArrayOop)Universe::heap()->array_allocate(this, size, length, 177 /* do_zero */ true, THREAD); 178 } 179 180 static int multi_alloc_counter = 0; 181 182 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) { 183 int length = *sizes; 184 // Call to lower_dimension uses this pointer, so most be called before a 185 // possible GC | 81 { 82 MutexUnlocker mu(MultiArray_lock); 83 super_klass = element_super->array_klass(CHECK_NULL); 84 for( int i = element_supers->length()-1; i >= 0; i-- ) { 85 Klass* elem_super = element_supers->at(i); 86 elem_super->array_klass(CHECK_NULL); 87 } 88 // Now retry from the beginning 89 ek = element_klass->array_klass(n, CHECK_NULL); 90 } // re-lock 91 return ek; 92 } 93 } else { 94 // The element type is already Object. Object[] has direct super of Object. 95 super_klass = SystemDictionary::Object_klass(); 96 } 97 } 98 99 // Create type name for klass. 100 Symbol* name = NULL; 101 { 102 ResourceMark rm(THREAD); 103 char *name_str = element_klass->name()->as_C_string(); 104 int len = element_klass->name()->utf8_length(); 105 char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); 106 int idx = 0; 107 new_str[idx++] = JVM_SIGNATURE_ARRAY; 108 if (element_klass->is_instance_klass()) { // it could be an array or simple type 109 new_str[idx++] = JVM_SIGNATURE_CLASS; 110 } 111 memcpy(&new_str[idx], name_str, len * sizeof(char)); 112 idx += len; 113 if (element_klass->is_instance_klass()) { 114 new_str[idx++] = JVM_SIGNATURE_ENDCLASS; 115 } 116 new_str[idx++] = '\0'; 117 name = SymbolTable::new_symbol(new_str); 118 } 119 120 // Initialize instance variables 121 ObjArrayKlass* oak = ObjArrayKlass::allocate(loader_data, n, element_klass, name, CHECK_NULL); 122 123 ModuleEntry* module = oak->module(); 124 assert(module != NULL, "No module entry for array"); 125 126 // Call complete_create_array_klass after all instance variables has been initialized. 127 ArrayKlass::complete_create_array_klass(oak, super_klass, module, CHECK_NULL); 128 129 // Add all classes to our internal class loader list here, 130 // including classes in the bootstrap (NULL) class loader. 131 // Do this step after creating the mirror so that if the 132 // mirror creation fails, loaded_classes_do() doesn't find 133 // an array class without a mirror. 134 loader_data->add_class(oak); 135 136 return oak; 137 } 138 139 ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name, ID) { 140 set_dimension(n); 141 set_element_klass(element_klass); 142 143 Klass* bk; 144 if (element_klass->is_objArray_klass()) { 145 bk = ObjArrayKlass::cast(element_klass)->bottom_klass(); 146 } else { 147 bk = element_klass; 148 } 149 assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass"); 150 set_bottom_klass(bk); 151 set_class_loader_data(bk->class_loader_data()); 152 153 set_layout_helper(array_layout_helper(T_OBJECT)); 154 assert(is_array_klass(), "sanity"); 155 assert(is_objArray_klass(), "sanity"); 156 } 157 158 int ObjArrayKlass::oop_size(oop obj) const { 159 assert(obj->is_objArray(), "must be object array"); 160 return objArrayOop(obj)->object_size(); 161 } 162 163 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) { 164 check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL); 165 int size = objArrayOopDesc::object_size(length); 166 return (objArrayOop)Universe::heap()->array_allocate(this, size, length, 167 /* do_zero */ true, THREAD); 168 } 169 170 static int multi_alloc_counter = 0; 171 172 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) { 173 int length = *sizes; 174 // Call to lower_dimension uses this pointer, so most be called before a 175 // possible GC |