< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page




 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 {


< prev index next >