132 assert(s->is_typeArray(), "must be type array");
133
134 // Check destination
135 if (!d->is_typeArray() || element_type() != TypeArrayKlass::cast(d->klass())->element_type()) {
136 THROW(vmSymbols::java_lang_ArrayStoreException());
137 }
138
139 // Check is all offsets and lengths are non negative
140 if (src_pos < 0 || dst_pos < 0 || length < 0) {
141 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
142 }
143 // Check if the ranges are valid
144 if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
145 || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
146 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
147 }
148 // Check zero copy
149 if (length == 0)
150 return;
151
152 // This is an attempt to make the copy_array fast.
153 int l2es = log2_element_size();
154 int ihs = array_header_in_bytes() / wordSize;
155 char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es);
156 char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es);
157 HeapAccess<>::arraycopy(s, d, src, dst, (size_t)length << l2es);
158 }
159
160
161 // create a klass of array holding typeArrays
162 Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
163 int dim = dimension();
164 assert(dim <= n, "check order of chain");
165 if (dim == n)
166 return this;
167
168 // lock-free read needs acquire semantics
169 if (higher_dimension_acquire() == NULL) {
170 if (or_null) return NULL;
171
172 ResourceMark rm;
173 JavaThread *jt = (JavaThread *)THREAD;
174 {
175 MutexLocker mc(Compile_lock, THREAD); // for vtables
176 // Atomic create higher dimension and link into list
177 MutexLocker mu(MultiArray_lock, THREAD);
|
132 assert(s->is_typeArray(), "must be type array");
133
134 // Check destination
135 if (!d->is_typeArray() || element_type() != TypeArrayKlass::cast(d->klass())->element_type()) {
136 THROW(vmSymbols::java_lang_ArrayStoreException());
137 }
138
139 // Check is all offsets and lengths are non negative
140 if (src_pos < 0 || dst_pos < 0 || length < 0) {
141 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
142 }
143 // Check if the ranges are valid
144 if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length())
145 || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
146 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
147 }
148 // Check zero copy
149 if (length == 0)
150 return;
151
152 typeArrayOop src = typeArrayOop(s);
153 typeArrayOop dst = typeArrayOop(d);
154
155 switch (element_type()) {
156 case T_BOOLEAN:
157 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->bool_at_addr(src_pos), dst->bool_at_addr(dst_pos), length);
158 break;
159 case T_CHAR:
160 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->char_at_addr(src_pos), dst->char_at_addr(dst_pos), length);
161 break;
162 case T_FLOAT:
163 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->float_at_addr(src_pos), dst->float_at_addr(dst_pos), length);
164 break;
165 case T_DOUBLE:
166 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->double_at_addr(src_pos), dst->double_at_addr(dst_pos), length);
167 break;
168 case T_BYTE:
169 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->byte_at_addr(src_pos), dst->byte_at_addr(dst_pos), length);
170 break;
171 case T_SHORT:
172 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->short_at_addr(src_pos), dst->short_at_addr(dst_pos), length);
173 break;
174 case T_INT:
175 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->int_at_addr(src_pos), dst->int_at_addr(dst_pos), length);
176 break;
177 case T_LONG:
178 HeapAccess<ARRAYCOPY_ATOMIC>::arraycopy(s, d, src->long_at_addr(src_pos), dst->long_at_addr(dst_pos), length);
179 break;
180 default:
181 ShouldNotReachHere();
182 }
183 }
184
185
186 // create a klass of array holding typeArrays
187 Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
188 int dim = dimension();
189 assert(dim <= n, "check order of chain");
190 if (dim == n)
191 return this;
192
193 // lock-free read needs acquire semantics
194 if (higher_dimension_acquire() == NULL) {
195 if (or_null) return NULL;
196
197 ResourceMark rm;
198 JavaThread *jt = (JavaThread *)THREAD;
199 {
200 MutexLocker mc(Compile_lock, THREAD); // for vtables
201 // Atomic create higher dimension and link into list
202 MutexLocker mu(MultiArray_lock, THREAD);
|