153 if (element_klass->is_objArray_klass()) {
154 bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
155 } else {
156 bk = element_klass;
157 }
158 assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
159 this->set_bottom_klass(bk);
160 this->set_class_loader_data(bk->class_loader_data());
161
162 this->set_layout_helper(array_layout_helper(T_OBJECT));
163 assert(this->is_array_klass(), "sanity");
164 assert(this->is_objArray_klass(), "sanity");
165 }
166
167 int ObjArrayKlass::oop_size(oop obj) const {
168 assert(obj->is_objArray(), "must be object array");
169 return objArrayOop(obj)->object_size();
170 }
171
172 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
173 if (length >= 0) {
174 if (length <= arrayOopDesc::max_array_length(T_OBJECT)) {
175 int size = objArrayOopDesc::object_size(length);
176 return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
177 /* do_zero */ true, THREAD);
178 } else {
179 report_java_out_of_memory("Requested array size exceeds VM limit");
180 JvmtiExport::post_array_size_exhausted();
181 THROW_OOP_0(Universe::out_of_memory_error_array_size());
182 }
183 } else {
184 THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
185 }
186 }
187
188 static int multi_alloc_counter = 0;
189
190 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
191 int length = *sizes;
192 // Call to lower_dimension uses this pointer, so most be called before a
193 // possible GC
194 Klass* ld_klass = lower_dimension();
195 // If length < 0 allocate will throw an exception.
196 objArrayOop array = allocate(length, CHECK_NULL);
197 objArrayHandle h_array (THREAD, array);
198 if (rank > 1) {
199 if (length != 0) {
200 for (int index = 0; index < length; index++) {
201 ArrayKlass* ak = ArrayKlass::cast(ld_klass);
202 oop sub_array = ak->multi_allocate(rank-1, &sizes[1], CHECK_NULL);
203 h_array->obj_at_put(index, sub_array);
204 }
205 } else {
|
153 if (element_klass->is_objArray_klass()) {
154 bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
155 } else {
156 bk = element_klass;
157 }
158 assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
159 this->set_bottom_klass(bk);
160 this->set_class_loader_data(bk->class_loader_data());
161
162 this->set_layout_helper(array_layout_helper(T_OBJECT));
163 assert(this->is_array_klass(), "sanity");
164 assert(this->is_objArray_klass(), "sanity");
165 }
166
167 int ObjArrayKlass::oop_size(oop obj) const {
168 assert(obj->is_objArray(), "must be object array");
169 return objArrayOop(obj)->object_size();
170 }
171
172 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
173 check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_0);
174 int size = objArrayOopDesc::object_size(length);
175 return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
176 /* do_zero */ true, THREAD);
177 }
178
179 static int multi_alloc_counter = 0;
180
181 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
182 int length = *sizes;
183 // Call to lower_dimension uses this pointer, so most be called before a
184 // possible GC
185 Klass* ld_klass = lower_dimension();
186 // If length < 0 allocate will throw an exception.
187 objArrayOop array = allocate(length, CHECK_NULL);
188 objArrayHandle h_array (THREAD, array);
189 if (rank > 1) {
190 if (length != 0) {
191 for (int index = 0; index < length; index++) {
192 ArrayKlass* ak = ArrayKlass::cast(ld_klass);
193 oop sub_array = ak->multi_allocate(rank-1, &sizes[1], CHECK_NULL);
194 h_array->obj_at_put(index, sub_array);
195 }
196 } else {
|