< prev index next >

src/hotspot/share/oops/objArrayKlass.cpp

Print this page

127     bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
128   } else {
129     bk = element_klass;
130   }
131   assert(bk != nullptr && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
132   set_bottom_klass(bk);
133   set_class_loader_data(bk->class_loader_data());
134 
135   if (element_klass->is_array_klass()) {
136     set_lower_dimension(ArrayKlass::cast(element_klass));
137   }
138 
139   set_layout_helper(array_layout_helper(T_OBJECT));
140   assert(is_array_klass(), "sanity");
141   assert(is_objArray_klass(), "sanity");
142 
143   // Compute modifier flags after bottom_klass and element_klass are initialized.
144   set_modifier_flags(compute_modifier_flags());
145 }
146 
147 size_t ObjArrayKlass::oop_size(oop obj) const {
148   // In this assert, we cannot safely access the Klass* with compact headers,
149   // because size_given_klass() calls oop_size() on objects that might be
150   // concurrently forwarded, which would overwrite the Klass*.
151   assert(UseCompactObjectHeaders || obj->is_objArray(), "must be object array");
152   return objArrayOop(obj)->object_size();

153 }
154 
155 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
156   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL);
157   size_t size = objArrayOopDesc::object_size(length);
158   return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
159                                                        /* do_zero */ true, THREAD);
160 }
161 
162 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
163   int length = *sizes;
164   ArrayKlass* ld_klass = lower_dimension();
165   // If length < 0 allocate will throw an exception.
166   objArrayOop array = allocate(length, CHECK_NULL);
167   objArrayHandle h_array (THREAD, array);
168   if (rank > 1) {
169     if (length != 0) {
170       for (int index = 0; index < length; index++) {
171         oop sub_array = ld_klass->multi_allocate(rank - 1, &sizes[1], CHECK_NULL);
172         h_array->obj_at_put(index, sub_array);

127     bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
128   } else {
129     bk = element_klass;
130   }
131   assert(bk != nullptr && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
132   set_bottom_klass(bk);
133   set_class_loader_data(bk->class_loader_data());
134 
135   if (element_klass->is_array_klass()) {
136     set_lower_dimension(ArrayKlass::cast(element_klass));
137   }
138 
139   set_layout_helper(array_layout_helper(T_OBJECT));
140   assert(is_array_klass(), "sanity");
141   assert(is_objArray_klass(), "sanity");
142 
143   // Compute modifier flags after bottom_klass and element_klass are initialized.
144   set_modifier_flags(compute_modifier_flags());
145 }
146 
147 size_t ObjArrayKlass::oop_size(oop obj, markWord mark) const {
148   // In this assert, we cannot safely access the Klass* with compact headers,
149   // because size_given_klass() calls oop_size() on objects that might be
150   // concurrently forwarded, which would overwrite the Klass*.
151   assert(UseCompactObjectHeaders || obj->is_objArray(), "must be object array");
152   int length = LP64_ONLY(UseCompactObjectHeaders ? mark.array_length() :) objArrayOop(obj)->length();
153   return objArrayOop(obj)->object_size(length);
154 }
155 
156 objArrayOop ObjArrayKlass::allocate(int length, TRAPS) {
157   check_array_allocation_length(length, arrayOopDesc::max_array_length(T_OBJECT), CHECK_NULL);
158   size_t size = objArrayOopDesc::object_size(length);
159   return (objArrayOop)Universe::heap()->array_allocate(this, size, length,
160                                                        /* do_zero */ true, THREAD);
161 }
162 
163 oop ObjArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) {
164   int length = *sizes;
165   ArrayKlass* ld_klass = lower_dimension();
166   // If length < 0 allocate will throw an exception.
167   objArrayOop array = allocate(length, CHECK_NULL);
168   objArrayHandle h_array (THREAD, array);
169   if (rank > 1) {
170     if (length != 0) {
171       for (int index = 0; index < length; index++) {
172         oop sub_array = ld_klass->multi_allocate(rank - 1, &sizes[1], CHECK_NULL);
173         h_array->obj_at_put(index, sub_array);
< prev index next >