Mercurial > hg > truffle
diff src/share/vm/opto/library_call.cpp @ 3411:ea0da5474c23
7047069: Array can dynamically change size when assigned to an object field
Summary: Fix initialization of a newly-allocated array with arraycopy
Reviewed-by: never
author | kvn |
---|---|
date | Fri, 27 May 2011 12:47:48 -0700 |
parents | e6d7eed3330c |
children | a92cdbac8b9e |
line wrap: on
line diff
--- a/src/share/vm/opto/library_call.cpp Wed May 25 21:17:07 2011 -0700 +++ b/src/share/vm/opto/library_call.cpp Fri May 27 12:47:48 2011 -0700 @@ -5225,15 +5225,16 @@ // Look at the alignment of the starting offsets. int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); - const intptr_t BIG_NEG = -128; - assert(BIG_NEG + 2*abase < 0, "neg enough"); - - intptr_t src_off = abase + ((intptr_t) find_int_con(src_offset, -1) << scale); - intptr_t dest_off = abase + ((intptr_t) find_int_con(dest_offset, -1) << scale); - if (src_off < 0 || dest_off < 0) + + intptr_t src_off_con = (intptr_t) find_int_con(src_offset, -1); + intptr_t dest_off_con = (intptr_t) find_int_con(dest_offset, -1); + if (src_off_con < 0 || dest_off_con < 0) // At present, we can only understand constants. return false; + intptr_t src_off = abase + (src_off_con << scale); + intptr_t dest_off = abase + (dest_off_con << scale); + if (((src_off | dest_off) & (BytesPerLong-1)) != 0) { // Non-aligned; too bad. // One more chance: Pick off an initial 32-bit word.