comparison src/share/vm/prims/methodComparator.cpp @ 1565:ab102d5d923e

6939207: refactor constant pool index processing Summary: Factored cleanup of instruction decode which prepares for enhanced ldc semantics. Reviewed-by: twisti
author jrose
date Sun, 23 May 2010 01:38:26 -0700
parents bd02caa94611
children beb77f0d41b3
comparison
equal deleted inserted replaced
1564:61b2245abf36 1565:ab102d5d923e
1 /* 1 /*
2 * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. 2 * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
128 case Bytecodes::_new : // fall through 128 case Bytecodes::_new : // fall through
129 case Bytecodes::_anewarray : // fall through 129 case Bytecodes::_anewarray : // fall through
130 case Bytecodes::_multianewarray : // fall through 130 case Bytecodes::_multianewarray : // fall through
131 case Bytecodes::_checkcast : // fall through 131 case Bytecodes::_checkcast : // fall through
132 case Bytecodes::_instanceof : { 132 case Bytecodes::_instanceof : {
133 u2 cpi_old = _s_old->get_index_big(); 133 u2 cpi_old = _s_old->get_index_u2();
134 u2 cpi_new = _s_new->get_index_big(); 134 u2 cpi_new = _s_new->get_index_u2();
135 if ((_old_cp->klass_at_noresolve(cpi_old) != _new_cp->klass_at_noresolve(cpi_new))) 135 if ((_old_cp->klass_at_noresolve(cpi_old) != _new_cp->klass_at_noresolve(cpi_new)))
136 return false; 136 return false;
137 if (c_old == Bytecodes::_multianewarray && 137 if (c_old == Bytecodes::_multianewarray &&
138 *(jbyte*)(_s_old->bcp() + 3) != *(jbyte*)(_s_new->bcp() + 3)) 138 *(jbyte*)(_s_old->bcp() + 3) != *(jbyte*)(_s_new->bcp() + 3))
139 return false; 139 return false;
145 case Bytecodes::_getfield : // fall through 145 case Bytecodes::_getfield : // fall through
146 case Bytecodes::_putfield : // fall through 146 case Bytecodes::_putfield : // fall through
147 case Bytecodes::_invokevirtual : // fall through 147 case Bytecodes::_invokevirtual : // fall through
148 case Bytecodes::_invokespecial : // fall through 148 case Bytecodes::_invokespecial : // fall through
149 case Bytecodes::_invokestatic : // fall through 149 case Bytecodes::_invokestatic : // fall through
150 case Bytecodes::_invokedynamic : // fall through
150 case Bytecodes::_invokeinterface : { 151 case Bytecodes::_invokeinterface : {
151 u2 cpci_old = _s_old->get_index_int(); 152 u2 cpci_old = _s_old->has_index_u4() ? _s_old->get_index_u4() : _s_old->get_index_u2();
152 u2 cpci_new = _s_new->get_index_int(); 153 u2 cpci_new = _s_new->has_index_u4() ? _s_new->get_index_u4() : _s_new->get_index_u2();
153 // Check if the names of classes, field/method names and signatures at these indexes 154 // Check if the names of classes, field/method names and signatures at these indexes
154 // are the same. Indices which are really into constantpool cache (rather than constant 155 // are the same. Indices which are really into constantpool cache (rather than constant
155 // pool itself) are accepted by the constantpool query routines below. 156 // pool itself) are accepted by the constantpool query routines below.
156 if ((_old_cp->klass_ref_at_noresolve(cpci_old) != _new_cp->klass_ref_at_noresolve(cpci_new)) || 157 if ((_old_cp->klass_ref_at_noresolve(cpci_old) != _new_cp->klass_ref_at_noresolve(cpci_new)) ||
157 (_old_cp->name_ref_at(cpci_old) != _new_cp->name_ref_at(cpci_new)) || 158 (_old_cp->name_ref_at(cpci_old) != _new_cp->name_ref_at(cpci_new)) ||
165 u2 cpi_old, cpi_new; 166 u2 cpi_old, cpi_new;
166 if (c_old == Bytecodes::_ldc) { 167 if (c_old == Bytecodes::_ldc) {
167 cpi_old = _s_old->bcp()[1]; 168 cpi_old = _s_old->bcp()[1];
168 cpi_new = _s_new->bcp()[1]; 169 cpi_new = _s_new->bcp()[1];
169 } else { 170 } else {
170 cpi_old = _s_old->get_index_big(); 171 cpi_old = _s_old->get_index_u2();
171 cpi_new = _s_new->get_index_big(); 172 cpi_new = _s_new->get_index_u2();
172 } 173 }
173 constantTag tag_old = _old_cp->tag_at(cpi_old); 174 constantTag tag_old = _old_cp->tag_at(cpi_old);
174 constantTag tag_new = _new_cp->tag_at(cpi_new); 175 constantTag tag_new = _new_cp->tag_at(cpi_new);
175 if (tag_old.is_int() || tag_old.is_float()) { 176 if (tag_old.is_int() || tag_old.is_float()) {
176 if (tag_old.value() != tag_new.value()) 177 if (tag_old.value() != tag_new.value())
197 } 198 }
198 break; 199 break;
199 } 200 }
200 201
201 case Bytecodes::_ldc2_w : { 202 case Bytecodes::_ldc2_w : {
202 u2 cpi_old = _s_old->get_index_big(); 203 u2 cpi_old = _s_old->get_index_u2();
203 u2 cpi_new = _s_new->get_index_big(); 204 u2 cpi_new = _s_new->get_index_u2();
204 constantTag tag_old = _old_cp->tag_at(cpi_old); 205 constantTag tag_old = _old_cp->tag_at(cpi_old);
205 constantTag tag_new = _new_cp->tag_at(cpi_new); 206 constantTag tag_new = _new_cp->tag_at(cpi_new);
206 if (tag_old.value() != tag_new.value()) 207 if (tag_old.value() != tag_new.value())
207 return false; 208 return false;
208 if (tag_old.is_long()) { 209 if (tag_old.is_long()) {
219 if (_s_old->bcp()[1] != _s_new->bcp()[1]) 220 if (_s_old->bcp()[1] != _s_new->bcp()[1])
220 return false; 221 return false;
221 break; 222 break;
222 223
223 case Bytecodes::_sipush : 224 case Bytecodes::_sipush :
224 if (_s_old->get_index_big() != _s_new->get_index_big()) 225 if (_s_old->get_index_u2() != _s_new->get_index_u2())
225 return false; 226 return false;
226 break; 227 break;
227 228
228 case Bytecodes::_aload : // fall through 229 case Bytecodes::_aload : // fall through
229 case Bytecodes::_astore : // fall through 230 case Bytecodes::_astore : // fall through
258 case Bytecodes::_ifgt : // fall through 259 case Bytecodes::_ifgt : // fall through
259 case Bytecodes::_ifle : // fall through 260 case Bytecodes::_ifle : // fall through
260 case Bytecodes::_ifnonnull : // fall through 261 case Bytecodes::_ifnonnull : // fall through
261 case Bytecodes::_ifnull : // fall through 262 case Bytecodes::_ifnull : // fall through
262 case Bytecodes::_jsr : { 263 case Bytecodes::_jsr : {
263 short old_ofs = (short) _s_old->get_index_big(); 264 short old_ofs = (short) _s_old->get_index_u2();
264 short new_ofs = (short) _s_new->get_index_big(); 265 short new_ofs = (short) _s_new->get_index_u2();
265 if (_switchable_test) { 266 if (_switchable_test) {
266 int old_dest = _s_old->bci() + old_ofs; 267 int old_dest = _s_old->bci() + old_ofs;
267 int new_dest = _s_new->bci() + new_ofs; 268 int new_dest = _s_new->bci() + new_ofs;
268 if (old_ofs < 0 && new_ofs < 0) { 269 if (old_ofs < 0 && new_ofs < 0) {
269 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))
283 284
284 case Bytecodes::_iinc : 285 case Bytecodes::_iinc :
285 if (_s_old->is_wide() != _s_new->is_wide()) 286 if (_s_old->is_wide() != _s_new->is_wide())
286 return false; 287 return false;
287 if (! _s_old->is_wide()) { 288 if (! _s_old->is_wide()) {
288 if (_s_old->get_index_big() != _s_new->get_index_big()) 289 // We could use get_index_u1 and get_constant_u1, but it's simpler to grab both bytes at once:
289 return false; 290 if (Bytes::get_Java_u2(_s_old->bcp() + 1) != Bytes::get_Java_u2(_s_new->bcp() + 1))
290 } else { 291 return false;
292 } else {
293 // We could use get_index_u2 and get_constant_u2, but it's simpler to grab all four bytes at once:
291 if (Bytes::get_Java_u4(_s_old->bcp() + 1) != Bytes::get_Java_u4(_s_new->bcp() + 1)) 294 if (Bytes::get_Java_u4(_s_old->bcp() + 1) != Bytes::get_Java_u4(_s_new->bcp() + 1))
292 return false; 295 return false;
293 } 296 }
294 break; 297 break;
295 298
355 _fwd_jmps->append(_s_old->bci() + ofs_old); 358 _fwd_jmps->append(_s_old->bci() + ofs_old);
356 _fwd_jmps->append(_s_new->bci() + ofs_new); 359 _fwd_jmps->append(_s_new->bci() + ofs_new);
357 } 360 }
358 } 361 }
359 } else { // !_switchable_test, can use fast rough compare 362 } else { // !_switchable_test, can use fast rough compare
360 int len_old = _s_old->next_bcp() - _s_old->bcp(); 363 int len_old = _s_old->instruction_size();
361 int len_new = _s_new->next_bcp() - _s_new->bcp(); 364 int len_new = _s_new->instruction_size();
362 if (len_old != len_new) 365 if (len_old != len_new)
363 return false; 366 return false;
364 if (memcmp(_s_old->bcp(), _s_new->bcp(), len_old) != 0) 367 if (memcmp(_s_old->bcp(), _s_new->bcp(), len_old) != 0)
365 return false; 368 return false;
366 } 369 }