Mercurial > hg > truffle
comparison src/share/vm/prims/methodComparator.cpp @ 1574:1eb493f33423
6957080: MethodComparator needs stress testing
Summary: Add a stress-test flag for running MethodComparator over many inputs. Fix bugs that crop up.
Reviewed-by: kvn
author | jrose |
---|---|
date | Sat, 29 May 2010 19:22:32 -0700 |
parents | beb77f0d41b3 |
children | e9ff18c4ace7 |
comparison
equal
deleted
inserted
replaced
1573:beb77f0d41b3 | 1574:1eb493f33423 |
---|---|
161 break; | 161 break; |
162 } | 162 } |
163 | 163 |
164 case Bytecodes::_ldc : // fall through | 164 case Bytecodes::_ldc : // fall through |
165 case Bytecodes::_ldc_w : { | 165 case Bytecodes::_ldc_w : { |
166 u2 cpi_old, cpi_new; | 166 Bytecode_loadconstant* ldc_old = Bytecode_loadconstant_at(_s_old->method()(), _s_old->bcp()); |
167 if (c_old == Bytecodes::_ldc) { | 167 Bytecode_loadconstant* ldc_new = Bytecode_loadconstant_at(_s_new->method()(), _s_new->bcp()); |
168 cpi_old = _s_old->bcp()[1]; | 168 int cpi_old = ldc_old->index(); |
169 cpi_new = _s_new->bcp()[1]; | 169 int cpi_new = ldc_new->index(); |
170 } else { | |
171 cpi_old = _s_old->get_index_u2(); | |
172 cpi_new = _s_new->get_index_u2(); | |
173 } | |
174 constantTag tag_old = _old_cp->tag_at(cpi_old); | 170 constantTag tag_old = _old_cp->tag_at(cpi_old); |
175 constantTag tag_new = _new_cp->tag_at(cpi_new); | 171 constantTag tag_new = _new_cp->tag_at(cpi_new); |
176 if (tag_old.is_int() || tag_old.is_float()) { | 172 if (tag_old.is_int() || tag_old.is_float()) { |
177 if (tag_old.value() != tag_new.value()) | 173 if (tag_old.value() != tag_new.value()) |
178 return false; | 174 return false; |
179 if (tag_old.is_int()) { | 175 if (tag_old.is_int()) { |
180 if (_old_cp->int_at(cpi_old) != _new_cp->int_at(cpi_new)) | 176 if (_old_cp->int_at(cpi_old) != _new_cp->int_at(cpi_new)) |
181 return false; | 177 return false; |
182 } else { | 178 } else { |
183 if (_old_cp->float_at(cpi_old) != _new_cp->float_at(cpi_new)) | 179 // Use jint_cast to compare the bits rather than numerical values. |
180 // This makes a difference for NaN constants. | |
181 if (jint_cast(_old_cp->float_at(cpi_old)) != jint_cast(_new_cp->float_at(cpi_new))) | |
184 return false; | 182 return false; |
185 } | 183 } |
186 } else if (tag_old.is_string() || tag_old.is_unresolved_string()) { | 184 } else if (tag_old.is_string() || tag_old.is_unresolved_string()) { |
187 if (! (tag_new.is_unresolved_string() || tag_new.is_string())) | 185 if (! (tag_new.is_unresolved_string() || tag_new.is_string())) |
188 return false; | 186 return false; |
208 return false; | 206 return false; |
209 if (tag_old.is_long()) { | 207 if (tag_old.is_long()) { |
210 if (_old_cp->long_at(cpi_old) != _new_cp->long_at(cpi_new)) | 208 if (_old_cp->long_at(cpi_old) != _new_cp->long_at(cpi_new)) |
211 return false; | 209 return false; |
212 } else { | 210 } else { |
213 if (_old_cp->double_at(cpi_old) != _new_cp->double_at(cpi_new)) | 211 // Use jlong_cast to compare the bits rather than numerical values. |
212 // This makes a difference for NaN constants. | |
213 if (jlong_cast(_old_cp->double_at(cpi_old)) != jlong_cast(_new_cp->double_at(cpi_new))) | |
214 return false; | 214 return false; |
215 } | 215 } |
216 break; | 216 break; |
217 } | 217 } |
218 | 218 |
259 case Bytecodes::_ifgt : // fall through | 259 case Bytecodes::_ifgt : // fall through |
260 case Bytecodes::_ifle : // fall through | 260 case Bytecodes::_ifle : // fall through |
261 case Bytecodes::_ifnonnull : // fall through | 261 case Bytecodes::_ifnonnull : // fall through |
262 case Bytecodes::_ifnull : // fall through | 262 case Bytecodes::_ifnull : // fall through |
263 case Bytecodes::_jsr : { | 263 case Bytecodes::_jsr : { |
264 short old_ofs = (short) _s_old->get_index_u2(); | 264 int old_ofs = _s_old->bytecode()->get_offset_s2(c_old); |
265 short new_ofs = (short) _s_new->get_index_u2(); | 265 int new_ofs = _s_new->bytecode()->get_offset_s2(c_new); |
266 if (_switchable_test) { | 266 if (_switchable_test) { |
267 int old_dest = _s_old->bci() + old_ofs; | 267 int old_dest = _s_old->bci() + old_ofs; |
268 int new_dest = _s_new->bci() + new_ofs; | 268 int new_dest = _s_new->bci() + new_ofs; |
269 if (old_ofs < 0 && new_ofs < 0) { | 269 if (old_ofs < 0 && new_ofs < 0) { |
270 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | 270 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) |
296 } | 296 } |
297 break; | 297 break; |
298 | 298 |
299 case Bytecodes::_goto_w : // fall through | 299 case Bytecodes::_goto_w : // fall through |
300 case Bytecodes::_jsr_w : { | 300 case Bytecodes::_jsr_w : { |
301 int old_ofs = (int) Bytes::get_Java_u4(_s_old->bcp() + 1); | 301 int old_ofs = _s_old->bytecode()->get_offset_s4(c_old); |
302 int new_ofs = (int) Bytes::get_Java_u4(_s_new->bcp() + 1); | 302 int new_ofs = _s_new->bytecode()->get_offset_s4(c_new); |
303 if (_switchable_test) { | 303 if (_switchable_test) { |
304 int old_dest = _s_old->bci() + old_ofs; | 304 int old_dest = _s_old->bci() + old_ofs; |
305 int new_dest = _s_new->bci() + new_ofs; | 305 int new_dest = _s_new->bci() + new_ofs; |
306 if (old_ofs < 0 && new_ofs < 0) { | 306 if (old_ofs < 0 && new_ofs < 0) { |
307 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | 307 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) |