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