281 THROW(vmSymbols::java_lang_ArrayStoreException()); 282 } 283 284 // Check is all offsets and lengths are non negative 285 if (src_pos < 0 || dst_pos < 0 || length < 0) { 286 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 287 } 288 // Check if the ranges are valid 289 if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) 290 || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) { 291 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 292 } 293 294 // Special case. Boundary cases must be checked first 295 // This allows the following call: copy_array(s, s.length(), d.length(), 0). 296 // This is correct, since the position is supposed to be an 'in between point', i.e., s.length(), 297 // points to the right of the last element. 298 if (length==0) { 299 return; 300 } 301 if (UseCompressedOops) { 302 narrowOop* const src = objArrayOop(s)->obj_at_addr<narrowOop>(src_pos); 303 narrowOop* const dst = objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos); 304 do_copy<narrowOop>(s, src, d, dst, length, CHECK); 305 } else { 306 oop* const src = objArrayOop(s)->obj_at_addr<oop>(src_pos); 307 oop* const dst = objArrayOop(d)->obj_at_addr<oop>(dst_pos); 308 do_copy<oop> (s, src, d, dst, length, CHECK); 309 } 310 } 311 312 313 Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) { 314 315 assert(dimension() <= n, "check order of chain"); 316 int dim = dimension(); 317 if (dim == n) return this; 318 319 if (higher_dimension() == NULL) { 320 if (or_null) return NULL; | 281 THROW(vmSymbols::java_lang_ArrayStoreException()); 282 } 283 284 // Check is all offsets and lengths are non negative 285 if (src_pos < 0 || dst_pos < 0 || length < 0) { 286 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 287 } 288 // Check if the ranges are valid 289 if ( (((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) 290 || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) { 291 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 292 } 293 294 // Special case. Boundary cases must be checked first 295 // This allows the following call: copy_array(s, s.length(), d.length(), 0). 296 // This is correct, since the position is supposed to be an 'in between point', i.e., s.length(), 297 // points to the right of the last element. 298 if (length==0) { 299 return; 300 } 301 302 s = arrayOop(oopDesc::bs()->read_barrier(s)); 303 d = arrayOop(oopDesc::bs()->write_barrier(d)); 304 305 if (UseCompressedOops) { 306 narrowOop* const src = objArrayOop(s)->obj_at_addr<narrowOop>(src_pos); 307 narrowOop* const dst = objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos); 308 do_copy<narrowOop>(s, src, d, dst, length, CHECK); 309 } else { 310 oop* const src = objArrayOop(s)->obj_at_addr<oop>(src_pos); 311 oop* const dst = objArrayOop(d)->obj_at_addr<oop>(dst_pos); 312 do_copy<oop> (s, src, d, dst, length, CHECK); 313 } 314 } 315 316 317 Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) { 318 319 assert(dimension() <= n, "check order of chain"); 320 int dim = dimension(); 321 if (dim == n) return this; 322 323 if (higher_dimension() == NULL) { 324 if (or_null) return NULL; |