Mercurial > hg > truffle
annotate src/share/vm/prims/methodComparator.cpp @ 8733:9def4075da6d
8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord
Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate().
Reviewed-by: johnc, ysr
Contributed-by: tamao <tao.mao@oracle.com>
author | tamao |
---|---|
date | Tue, 05 Mar 2013 15:36:56 -0800 |
parents | da91efe96a93 |
children |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
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 | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "oops/oop.inline.hpp" | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2142
diff
changeset
|
27 #include "oops/symbol.hpp" |
1972 | 28 #include "prims/jvmtiRedefineClassesTrace.hpp" |
29 #include "prims/methodComparator.hpp" | |
30 #include "runtime/handles.inline.hpp" | |
31 #include "utilities/globalDefinitions.hpp" | |
0 | 32 |
33 BytecodeStream *MethodComparator::_s_old; | |
34 BytecodeStream *MethodComparator::_s_new; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
35 ConstantPool* MethodComparator::_old_cp; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
36 ConstantPool* MethodComparator::_new_cp; |
0 | 37 BciMap *MethodComparator::_bci_map; |
38 bool MethodComparator::_switchable_test; | |
39 GrowableArray<int> *MethodComparator::_fwd_jmps; | |
40 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
41 bool MethodComparator::methods_EMCP(Method* old_method, Method* new_method) { |
0 | 42 if (old_method->code_size() != new_method->code_size()) |
43 return false; | |
44 if (check_stack_and_locals_size(old_method, new_method) != 0) { | |
45 // RC_TRACE macro has an embedded ResourceMark | |
46 RC_TRACE(0x00800000, ("Methods %s non-comparable with diagnosis %d", | |
47 old_method->name()->as_C_string(), | |
48 check_stack_and_locals_size(old_method, new_method))); | |
49 return false; | |
50 } | |
51 | |
52 _old_cp = old_method->constants(); | |
53 _new_cp = new_method->constants(); | |
54 BytecodeStream s_old(old_method); | |
55 BytecodeStream s_new(new_method); | |
56 _s_old = &s_old; | |
57 _s_new = &s_new; | |
58 _switchable_test = false; | |
59 Bytecodes::Code c_old, c_new; | |
60 | |
61 while ((c_old = s_old.next()) >= 0) { | |
62 if ((c_new = s_new.next()) < 0 || c_old != c_new) | |
63 return false; | |
64 | |
65 if (! args_same(c_old, c_new)) | |
66 return false; | |
67 } | |
68 return true; | |
69 } | |
70 | |
71 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
72 bool MethodComparator::methods_switchable(Method* old_method, Method* new_method, |
0 | 73 BciMap &bci_map) { |
74 if (old_method->code_size() > new_method->code_size()) | |
75 // Something has definitely been deleted in the new method, compared to the old one. | |
76 return false; | |
77 | |
78 if (! check_stack_and_locals_size(old_method, new_method)) | |
79 return false; | |
80 | |
81 _old_cp = old_method->constants(); | |
82 _new_cp = new_method->constants(); | |
83 BytecodeStream s_old(old_method); | |
84 BytecodeStream s_new(new_method); | |
85 _s_old = &s_old; | |
86 _s_new = &s_new; | |
87 _bci_map = &bci_map; | |
88 _switchable_test = true; | |
89 GrowableArray<int> fwd_jmps(16); | |
90 _fwd_jmps = &fwd_jmps; | |
91 Bytecodes::Code c_old, c_new; | |
92 | |
93 while ((c_old = s_old.next()) >= 0) { | |
94 if ((c_new = s_new.next()) < 0) | |
95 return false; | |
96 if (! (c_old == c_new && args_same(c_old, c_new))) { | |
97 int old_bci = s_old.bci(); | |
98 int new_st_bci = s_new.bci(); | |
99 bool found_match = false; | |
100 do { | |
101 c_new = s_new.next(); | |
102 if (c_new == c_old && args_same(c_old, c_new)) { | |
103 found_match = true; | |
104 break; | |
105 } | |
106 } while (c_new >= 0); | |
107 if (! found_match) | |
108 return false; | |
109 int new_end_bci = s_new.bci(); | |
110 bci_map.store_fragment_location(old_bci, new_st_bci, new_end_bci); | |
111 } | |
112 } | |
113 | |
114 // Now we can test all forward jumps | |
115 for (int i = 0; i < fwd_jmps.length() / 2; i++) { | |
116 if (! bci_map.old_and_new_locations_same(fwd_jmps.at(i*2), fwd_jmps.at(i*2+1))) { | |
117 RC_TRACE(0x00800000, | |
118 ("Fwd jump miss: old dest = %d, calc new dest = %d, act new dest = %d", | |
119 fwd_jmps.at(i*2), bci_map.new_bci_for_old(fwd_jmps.at(i*2)), | |
120 fwd_jmps.at(i*2+1))); | |
121 return false; | |
122 } | |
123 } | |
124 | |
125 return true; | |
126 } | |
127 | |
128 | |
129 bool MethodComparator::args_same(Bytecodes::Code c_old, Bytecodes::Code c_new) { | |
130 // BytecodeStream returns the correct standard Java bytecodes for various "fast" | |
131 // bytecode versions, so we don't have to bother about them here.. | |
132 switch (c_old) { | |
133 case Bytecodes::_new : // fall through | |
134 case Bytecodes::_anewarray : // fall through | |
135 case Bytecodes::_multianewarray : // fall through | |
136 case Bytecodes::_checkcast : // fall through | |
137 case Bytecodes::_instanceof : { | |
1565 | 138 u2 cpi_old = _s_old->get_index_u2(); |
139 u2 cpi_new = _s_new->get_index_u2(); | |
0 | 140 if ((_old_cp->klass_at_noresolve(cpi_old) != _new_cp->klass_at_noresolve(cpi_new))) |
141 return false; | |
142 if (c_old == Bytecodes::_multianewarray && | |
143 *(jbyte*)(_s_old->bcp() + 3) != *(jbyte*)(_s_new->bcp() + 3)) | |
144 return false; | |
145 break; | |
146 } | |
147 | |
148 case Bytecodes::_getstatic : // fall through | |
149 case Bytecodes::_putstatic : // fall through | |
150 case Bytecodes::_getfield : // fall through | |
151 case Bytecodes::_putfield : // fall through | |
152 case Bytecodes::_invokevirtual : // fall through | |
153 case Bytecodes::_invokespecial : // fall through | |
154 case Bytecodes::_invokestatic : // fall through | |
155 case Bytecodes::_invokeinterface : { | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
156 int cpci_old = _s_old->get_index_u2_cpcache(); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
157 int cpci_new = _s_new->get_index_u2_cpcache(); |
0 | 158 // Check if the names of classes, field/method names and signatures at these indexes |
159 // are the same. Indices which are really into constantpool cache (rather than constant | |
160 // pool itself) are accepted by the constantpool query routines below. | |
161 if ((_old_cp->klass_ref_at_noresolve(cpci_old) != _new_cp->klass_ref_at_noresolve(cpci_new)) || | |
162 (_old_cp->name_ref_at(cpci_old) != _new_cp->name_ref_at(cpci_new)) || | |
163 (_old_cp->signature_ref_at(cpci_old) != _new_cp->signature_ref_at(cpci_new))) | |
164 return false; | |
165 break; | |
166 } | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
167 case Bytecodes::_invokedynamic: { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
168 int cpci_old = _s_old->get_index_u4(); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
169 int cpci_new = _s_new->get_index_u4(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
170 |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
171 // Check if the names of classes, field/method names and signatures at these indexes |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
172 // are the same. Indices which are really into constantpool cache (rather than constant |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
173 // pool itself) are accepted by the constantpool query routines below. |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
174 if ((_old_cp->name_ref_at(cpci_old) != _new_cp->name_ref_at(cpci_new)) || |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
175 (_old_cp->signature_ref_at(cpci_old) != _new_cp->signature_ref_at(cpci_new))) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
176 return false; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
177 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
178 // Translate object indexes to constant pool cache indexes. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
179 cpci_old = _old_cp->invokedynamic_cp_cache_index(cpci_old); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
180 cpci_new = _new_cp->invokedynamic_cp_cache_index(cpci_new); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
181 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
182 int cpi_old = _old_cp->cache()->entry_at(cpci_old)->constant_pool_index(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
183 int cpi_new = _new_cp->cache()->entry_at(cpci_new)->constant_pool_index(); |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
184 int bsm_old = _old_cp->invoke_dynamic_bootstrap_method_ref_index_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
185 int bsm_new = _new_cp->invoke_dynamic_bootstrap_method_ref_index_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
186 if (!pool_constants_same(bsm_old, bsm_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
187 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
188 int cnt_old = _old_cp->invoke_dynamic_argument_count_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
189 int cnt_new = _new_cp->invoke_dynamic_argument_count_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
190 if (cnt_old != cnt_new) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
191 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
192 for (int arg_i = 0; arg_i < cnt_old; arg_i++) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
193 int idx_old = _old_cp->invoke_dynamic_argument_index_at(cpi_old, arg_i); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
194 int idx_new = _new_cp->invoke_dynamic_argument_index_at(cpi_new, arg_i); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
195 if (!pool_constants_same(idx_old, idx_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
196 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
197 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
198 break; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
199 } |
0 | 200 |
201 case Bytecodes::_ldc : // fall through | |
202 case Bytecodes::_ldc_w : { | |
2142 | 203 Bytecode_loadconstant ldc_old(_s_old->method(), _s_old->bci()); |
204 Bytecode_loadconstant ldc_new(_s_new->method(), _s_new->bci()); | |
205 int cpi_old = ldc_old.pool_index(); | |
206 int cpi_new = ldc_new.pool_index(); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
207 if (!pool_constants_same(cpi_old, cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
208 return false; |
0 | 209 break; |
210 } | |
211 | |
212 case Bytecodes::_ldc2_w : { | |
1565 | 213 u2 cpi_old = _s_old->get_index_u2(); |
214 u2 cpi_new = _s_new->get_index_u2(); | |
0 | 215 constantTag tag_old = _old_cp->tag_at(cpi_old); |
216 constantTag tag_new = _new_cp->tag_at(cpi_new); | |
217 if (tag_old.value() != tag_new.value()) | |
218 return false; | |
219 if (tag_old.is_long()) { | |
220 if (_old_cp->long_at(cpi_old) != _new_cp->long_at(cpi_new)) | |
221 return false; | |
222 } else { | |
1574 | 223 // Use jlong_cast to compare the bits rather than numerical values. |
224 // This makes a difference for NaN constants. | |
225 if (jlong_cast(_old_cp->double_at(cpi_old)) != jlong_cast(_new_cp->double_at(cpi_new))) | |
0 | 226 return false; |
227 } | |
228 break; | |
229 } | |
230 | |
231 case Bytecodes::_bipush : | |
232 if (_s_old->bcp()[1] != _s_new->bcp()[1]) | |
233 return false; | |
234 break; | |
235 | |
236 case Bytecodes::_sipush : | |
1565 | 237 if (_s_old->get_index_u2() != _s_new->get_index_u2()) |
0 | 238 return false; |
239 break; | |
240 | |
241 case Bytecodes::_aload : // fall through | |
242 case Bytecodes::_astore : // fall through | |
243 case Bytecodes::_dload : // fall through | |
244 case Bytecodes::_dstore : // fall through | |
245 case Bytecodes::_fload : // fall through | |
246 case Bytecodes::_fstore : // fall through | |
247 case Bytecodes::_iload : // fall through | |
248 case Bytecodes::_istore : // fall through | |
249 case Bytecodes::_lload : // fall through | |
250 case Bytecodes::_lstore : // fall through | |
251 case Bytecodes::_ret : | |
252 if (_s_old->is_wide() != _s_new->is_wide()) | |
253 return false; | |
254 if (_s_old->get_index() != _s_new->get_index()) | |
255 return false; | |
256 break; | |
257 | |
258 case Bytecodes::_goto : // fall through | |
259 case Bytecodes::_if_acmpeq : // fall through | |
260 case Bytecodes::_if_acmpne : // fall through | |
261 case Bytecodes::_if_icmpeq : // fall through | |
262 case Bytecodes::_if_icmpne : // fall through | |
263 case Bytecodes::_if_icmplt : // fall through | |
264 case Bytecodes::_if_icmpge : // fall through | |
265 case Bytecodes::_if_icmpgt : // fall through | |
266 case Bytecodes::_if_icmple : // fall through | |
267 case Bytecodes::_ifeq : // fall through | |
268 case Bytecodes::_ifne : // fall through | |
269 case Bytecodes::_iflt : // fall through | |
270 case Bytecodes::_ifge : // fall through | |
271 case Bytecodes::_ifgt : // fall through | |
272 case Bytecodes::_ifle : // fall through | |
273 case Bytecodes::_ifnonnull : // fall through | |
274 case Bytecodes::_ifnull : // fall through | |
275 case Bytecodes::_jsr : { | |
2142 | 276 int old_ofs = _s_old->bytecode().get_offset_s2(c_old); |
277 int new_ofs = _s_new->bytecode().get_offset_s2(c_new); | |
0 | 278 if (_switchable_test) { |
279 int old_dest = _s_old->bci() + old_ofs; | |
280 int new_dest = _s_new->bci() + new_ofs; | |
281 if (old_ofs < 0 && new_ofs < 0) { | |
282 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | |
283 return false; | |
284 } else if (old_ofs > 0 && new_ofs > 0) { | |
285 _fwd_jmps->append(old_dest); | |
286 _fwd_jmps->append(new_dest); | |
287 } else { | |
288 return false; | |
289 } | |
290 } else { | |
291 if (old_ofs != new_ofs) | |
292 return false; | |
293 } | |
294 break; | |
295 } | |
296 | |
297 case Bytecodes::_iinc : | |
298 if (_s_old->is_wide() != _s_new->is_wide()) | |
299 return false; | |
300 if (! _s_old->is_wide()) { | |
1565 | 301 // We could use get_index_u1 and get_constant_u1, but it's simpler to grab both bytes at once: |
302 if (Bytes::get_Java_u2(_s_old->bcp() + 1) != Bytes::get_Java_u2(_s_new->bcp() + 1)) | |
0 | 303 return false; |
304 } else { | |
1565 | 305 // We could use get_index_u2 and get_constant_u2, but it's simpler to grab all four bytes at once: |
0 | 306 if (Bytes::get_Java_u4(_s_old->bcp() + 1) != Bytes::get_Java_u4(_s_new->bcp() + 1)) |
307 return false; | |
308 } | |
309 break; | |
310 | |
311 case Bytecodes::_goto_w : // fall through | |
312 case Bytecodes::_jsr_w : { | |
2142 | 313 int old_ofs = _s_old->bytecode().get_offset_s4(c_old); |
314 int new_ofs = _s_new->bytecode().get_offset_s4(c_new); | |
0 | 315 if (_switchable_test) { |
316 int old_dest = _s_old->bci() + old_ofs; | |
317 int new_dest = _s_new->bci() + new_ofs; | |
318 if (old_ofs < 0 && new_ofs < 0) { | |
319 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | |
320 return false; | |
321 } else if (old_ofs > 0 && new_ofs > 0) { | |
322 _fwd_jmps->append(old_dest); | |
323 _fwd_jmps->append(new_dest); | |
324 } else { | |
325 return false; | |
326 } | |
327 } else { | |
328 if (old_ofs != new_ofs) | |
329 return false; | |
330 } | |
331 break; | |
332 } | |
333 | |
334 case Bytecodes::_lookupswitch : // fall through | |
335 case Bytecodes::_tableswitch : { | |
336 if (_switchable_test) { | |
337 address aligned_bcp_old = (address) round_to((intptr_t)_s_old->bcp() + 1, jintSize); | |
338 address aligned_bcp_new = (address) round_to((intptr_t)_s_new->bcp() + 1, jintSize); | |
339 int default_old = (int) Bytes::get_Java_u4(aligned_bcp_old); | |
340 int default_new = (int) Bytes::get_Java_u4(aligned_bcp_new); | |
341 _fwd_jmps->append(_s_old->bci() + default_old); | |
342 _fwd_jmps->append(_s_new->bci() + default_new); | |
343 if (c_old == Bytecodes::_lookupswitch) { | |
344 int npairs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + jintSize); | |
345 int npairs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + jintSize); | |
346 if (npairs_old != npairs_new) | |
347 return false; | |
348 for (int i = 0; i < npairs_old; i++) { | |
349 int match_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (2+2*i)*jintSize); | |
350 int match_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (2+2*i)*jintSize); | |
351 if (match_old != match_new) | |
352 return false; | |
353 int ofs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (2+2*i+1)*jintSize); | |
354 int ofs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (2+2*i+1)*jintSize); | |
355 _fwd_jmps->append(_s_old->bci() + ofs_old); | |
356 _fwd_jmps->append(_s_new->bci() + ofs_new); | |
357 } | |
358 } else if (c_old == Bytecodes::_tableswitch) { | |
359 int lo_old = (int) Bytes::get_Java_u4(aligned_bcp_old + jintSize); | |
360 int lo_new = (int) Bytes::get_Java_u4(aligned_bcp_new + jintSize); | |
361 if (lo_old != lo_new) | |
362 return false; | |
363 int hi_old = (int) Bytes::get_Java_u4(aligned_bcp_old + 2*jintSize); | |
364 int hi_new = (int) Bytes::get_Java_u4(aligned_bcp_new + 2*jintSize); | |
365 if (hi_old != hi_new) | |
366 return false; | |
367 for (int i = 0; i < hi_old - lo_old + 1; i++) { | |
368 int ofs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (3+i)*jintSize); | |
369 int ofs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (3+i)*jintSize); | |
370 _fwd_jmps->append(_s_old->bci() + ofs_old); | |
371 _fwd_jmps->append(_s_new->bci() + ofs_new); | |
372 } | |
373 } | |
374 } else { // !_switchable_test, can use fast rough compare | |
1565 | 375 int len_old = _s_old->instruction_size(); |
376 int len_new = _s_new->instruction_size(); | |
0 | 377 if (len_old != len_new) |
378 return false; | |
379 if (memcmp(_s_old->bcp(), _s_new->bcp(), len_old) != 0) | |
380 return false; | |
381 } | |
382 break; | |
383 } | |
384 } | |
385 | |
386 return true; | |
387 } | |
388 | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
389 bool MethodComparator::pool_constants_same(int cpi_old, int cpi_new) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
390 constantTag tag_old = _old_cp->tag_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
391 constantTag tag_new = _new_cp->tag_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
392 if (tag_old.is_int() || tag_old.is_float()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
393 if (tag_old.value() != tag_new.value()) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
394 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
395 if (tag_old.is_int()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
396 if (_old_cp->int_at(cpi_old) != _new_cp->int_at(cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
397 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
398 } else { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
399 // Use jint_cast to compare the bits rather than numerical values. |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
400 // This makes a difference for NaN constants. |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
401 if (jint_cast(_old_cp->float_at(cpi_old)) != jint_cast(_new_cp->float_at(cpi_new))) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
402 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
403 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
404 } else if (tag_old.is_string() && tag_new.is_string()) { |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
405 if (strcmp(_old_cp->string_at_noresolve(cpi_old), |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
406 _new_cp->string_at_noresolve(cpi_new)) != 0) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
407 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
408 } else if (tag_old.is_klass() || tag_old.is_unresolved_klass()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
409 // tag_old should be klass - 4881222 |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
410 if (! (tag_new.is_unresolved_klass() || tag_new.is_klass())) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
411 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
412 if (_old_cp->klass_at_noresolve(cpi_old) != |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
413 _new_cp->klass_at_noresolve(cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
414 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
415 } else if (tag_old.is_method_type() && tag_new.is_method_type()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
416 int mti_old = _old_cp->method_type_index_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
417 int mti_new = _new_cp->method_type_index_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
418 if ((_old_cp->symbol_at(mti_old) != _new_cp->symbol_at(mti_new))) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
419 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
420 } else if (tag_old.is_method_handle() && tag_new.is_method_handle()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
421 if (_old_cp->method_handle_ref_kind_at(cpi_old) != |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
422 _new_cp->method_handle_ref_kind_at(cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
423 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
424 int mhi_old = _old_cp->method_handle_index_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
425 int mhi_new = _new_cp->method_handle_index_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
426 if ((_old_cp->uncached_klass_ref_at_noresolve(mhi_old) != _new_cp->uncached_klass_ref_at_noresolve(mhi_new)) || |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
427 (_old_cp->uncached_name_ref_at(mhi_old) != _new_cp->uncached_name_ref_at(mhi_new)) || |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
428 (_old_cp->uncached_signature_ref_at(mhi_old) != _new_cp->uncached_signature_ref_at(mhi_new))) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
429 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
430 } else { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
431 return false; // unknown tag |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
432 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
433 return true; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
434 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
435 |
0 | 436 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
2177
diff
changeset
|
437 int MethodComparator::check_stack_and_locals_size(Method* old_method, Method* new_method) { |
0 | 438 if (old_method->max_stack() != new_method->max_stack()) { |
439 return 1; | |
440 } else if (old_method->max_locals() != new_method->max_locals()) { | |
441 return 2; | |
442 } else if (old_method->size_of_parameters() != new_method->size_of_parameters()) { | |
443 return 3; | |
444 } else return 0; | |
445 } |