Mercurial > hg > graal-jvmci-8
annotate src/share/vm/prims/methodComparator.cpp @ 3249:e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author | johnc |
---|---|
date | Thu, 07 Apr 2011 09:53:20 -0700 |
parents | 3582bf76420e |
children | da91efe96a93 |
rev | line source |
---|---|
0 | 1 /* |
2142 | 2 * Copyright (c) 2000, 2011, 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; | |
35 constantPoolOop MethodComparator::_old_cp; | |
36 constantPoolOop MethodComparator::_new_cp; | |
37 BciMap *MethodComparator::_bci_map; | |
38 bool MethodComparator::_switchable_test; | |
39 GrowableArray<int> *MethodComparator::_fwd_jmps; | |
40 | |
41 bool MethodComparator::methods_EMCP(methodOop old_method, methodOop new_method) { | |
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 | |
72 bool MethodComparator::methods_switchable(methodOop old_method, methodOop new_method, | |
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(); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
170 // 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
|
171 // 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
|
172 // pool itself) are accepted by the constantpool query routines below. |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
173 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
|
174 (_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
|
175 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
176 int cpi_old = _old_cp->cache()->main_entry_at(cpci_old)->constant_pool_index(); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
177 int cpi_new = _new_cp->cache()->main_entry_at(cpci_new)->constant_pool_index(); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
178 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
|
179 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
|
180 if (!pool_constants_same(bsm_old, bsm_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
181 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
182 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
|
183 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
|
184 if (cnt_old != cnt_new) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
185 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
186 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
|
187 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
|
188 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
|
189 if (!pool_constants_same(idx_old, idx_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
190 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
191 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
192 break; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
193 } |
0 | 194 |
195 case Bytecodes::_ldc : // fall through | |
196 case Bytecodes::_ldc_w : { | |
2142 | 197 Bytecode_loadconstant ldc_old(_s_old->method(), _s_old->bci()); |
198 Bytecode_loadconstant ldc_new(_s_new->method(), _s_new->bci()); | |
199 int cpi_old = ldc_old.pool_index(); | |
200 int cpi_new = ldc_new.pool_index(); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
201 if (!pool_constants_same(cpi_old, cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
202 return false; |
0 | 203 break; |
204 } | |
205 | |
206 case Bytecodes::_ldc2_w : { | |
1565 | 207 u2 cpi_old = _s_old->get_index_u2(); |
208 u2 cpi_new = _s_new->get_index_u2(); | |
0 | 209 constantTag tag_old = _old_cp->tag_at(cpi_old); |
210 constantTag tag_new = _new_cp->tag_at(cpi_new); | |
211 if (tag_old.value() != tag_new.value()) | |
212 return false; | |
213 if (tag_old.is_long()) { | |
214 if (_old_cp->long_at(cpi_old) != _new_cp->long_at(cpi_new)) | |
215 return false; | |
216 } else { | |
1574 | 217 // Use jlong_cast to compare the bits rather than numerical values. |
218 // This makes a difference for NaN constants. | |
219 if (jlong_cast(_old_cp->double_at(cpi_old)) != jlong_cast(_new_cp->double_at(cpi_new))) | |
0 | 220 return false; |
221 } | |
222 break; | |
223 } | |
224 | |
225 case Bytecodes::_bipush : | |
226 if (_s_old->bcp()[1] != _s_new->bcp()[1]) | |
227 return false; | |
228 break; | |
229 | |
230 case Bytecodes::_sipush : | |
1565 | 231 if (_s_old->get_index_u2() != _s_new->get_index_u2()) |
0 | 232 return false; |
233 break; | |
234 | |
235 case Bytecodes::_aload : // fall through | |
236 case Bytecodes::_astore : // fall through | |
237 case Bytecodes::_dload : // fall through | |
238 case Bytecodes::_dstore : // fall through | |
239 case Bytecodes::_fload : // fall through | |
240 case Bytecodes::_fstore : // fall through | |
241 case Bytecodes::_iload : // fall through | |
242 case Bytecodes::_istore : // fall through | |
243 case Bytecodes::_lload : // fall through | |
244 case Bytecodes::_lstore : // fall through | |
245 case Bytecodes::_ret : | |
246 if (_s_old->is_wide() != _s_new->is_wide()) | |
247 return false; | |
248 if (_s_old->get_index() != _s_new->get_index()) | |
249 return false; | |
250 break; | |
251 | |
252 case Bytecodes::_goto : // fall through | |
253 case Bytecodes::_if_acmpeq : // fall through | |
254 case Bytecodes::_if_acmpne : // fall through | |
255 case Bytecodes::_if_icmpeq : // fall through | |
256 case Bytecodes::_if_icmpne : // fall through | |
257 case Bytecodes::_if_icmplt : // fall through | |
258 case Bytecodes::_if_icmpge : // fall through | |
259 case Bytecodes::_if_icmpgt : // fall through | |
260 case Bytecodes::_if_icmple : // fall through | |
261 case Bytecodes::_ifeq : // fall through | |
262 case Bytecodes::_ifne : // fall through | |
263 case Bytecodes::_iflt : // fall through | |
264 case Bytecodes::_ifge : // fall through | |
265 case Bytecodes::_ifgt : // fall through | |
266 case Bytecodes::_ifle : // fall through | |
267 case Bytecodes::_ifnonnull : // fall through | |
268 case Bytecodes::_ifnull : // fall through | |
269 case Bytecodes::_jsr : { | |
2142 | 270 int old_ofs = _s_old->bytecode().get_offset_s2(c_old); |
271 int new_ofs = _s_new->bytecode().get_offset_s2(c_new); | |
0 | 272 if (_switchable_test) { |
273 int old_dest = _s_old->bci() + old_ofs; | |
274 int new_dest = _s_new->bci() + new_ofs; | |
275 if (old_ofs < 0 && new_ofs < 0) { | |
276 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | |
277 return false; | |
278 } else if (old_ofs > 0 && new_ofs > 0) { | |
279 _fwd_jmps->append(old_dest); | |
280 _fwd_jmps->append(new_dest); | |
281 } else { | |
282 return false; | |
283 } | |
284 } else { | |
285 if (old_ofs != new_ofs) | |
286 return false; | |
287 } | |
288 break; | |
289 } | |
290 | |
291 case Bytecodes::_iinc : | |
292 if (_s_old->is_wide() != _s_new->is_wide()) | |
293 return false; | |
294 if (! _s_old->is_wide()) { | |
1565 | 295 // We could use get_index_u1 and get_constant_u1, but it's simpler to grab both bytes at once: |
296 if (Bytes::get_Java_u2(_s_old->bcp() + 1) != Bytes::get_Java_u2(_s_new->bcp() + 1)) | |
0 | 297 return false; |
298 } else { | |
1565 | 299 // We could use get_index_u2 and get_constant_u2, but it's simpler to grab all four bytes at once: |
0 | 300 if (Bytes::get_Java_u4(_s_old->bcp() + 1) != Bytes::get_Java_u4(_s_new->bcp() + 1)) |
301 return false; | |
302 } | |
303 break; | |
304 | |
305 case Bytecodes::_goto_w : // fall through | |
306 case Bytecodes::_jsr_w : { | |
2142 | 307 int old_ofs = _s_old->bytecode().get_offset_s4(c_old); |
308 int new_ofs = _s_new->bytecode().get_offset_s4(c_new); | |
0 | 309 if (_switchable_test) { |
310 int old_dest = _s_old->bci() + old_ofs; | |
311 int new_dest = _s_new->bci() + new_ofs; | |
312 if (old_ofs < 0 && new_ofs < 0) { | |
313 if (! _bci_map->old_and_new_locations_same(old_dest, new_dest)) | |
314 return false; | |
315 } else if (old_ofs > 0 && new_ofs > 0) { | |
316 _fwd_jmps->append(old_dest); | |
317 _fwd_jmps->append(new_dest); | |
318 } else { | |
319 return false; | |
320 } | |
321 } else { | |
322 if (old_ofs != new_ofs) | |
323 return false; | |
324 } | |
325 break; | |
326 } | |
327 | |
328 case Bytecodes::_lookupswitch : // fall through | |
329 case Bytecodes::_tableswitch : { | |
330 if (_switchable_test) { | |
331 address aligned_bcp_old = (address) round_to((intptr_t)_s_old->bcp() + 1, jintSize); | |
332 address aligned_bcp_new = (address) round_to((intptr_t)_s_new->bcp() + 1, jintSize); | |
333 int default_old = (int) Bytes::get_Java_u4(aligned_bcp_old); | |
334 int default_new = (int) Bytes::get_Java_u4(aligned_bcp_new); | |
335 _fwd_jmps->append(_s_old->bci() + default_old); | |
336 _fwd_jmps->append(_s_new->bci() + default_new); | |
337 if (c_old == Bytecodes::_lookupswitch) { | |
338 int npairs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + jintSize); | |
339 int npairs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + jintSize); | |
340 if (npairs_old != npairs_new) | |
341 return false; | |
342 for (int i = 0; i < npairs_old; i++) { | |
343 int match_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (2+2*i)*jintSize); | |
344 int match_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (2+2*i)*jintSize); | |
345 if (match_old != match_new) | |
346 return false; | |
347 int ofs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (2+2*i+1)*jintSize); | |
348 int ofs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (2+2*i+1)*jintSize); | |
349 _fwd_jmps->append(_s_old->bci() + ofs_old); | |
350 _fwd_jmps->append(_s_new->bci() + ofs_new); | |
351 } | |
352 } else if (c_old == Bytecodes::_tableswitch) { | |
353 int lo_old = (int) Bytes::get_Java_u4(aligned_bcp_old + jintSize); | |
354 int lo_new = (int) Bytes::get_Java_u4(aligned_bcp_new + jintSize); | |
355 if (lo_old != lo_new) | |
356 return false; | |
357 int hi_old = (int) Bytes::get_Java_u4(aligned_bcp_old + 2*jintSize); | |
358 int hi_new = (int) Bytes::get_Java_u4(aligned_bcp_new + 2*jintSize); | |
359 if (hi_old != hi_new) | |
360 return false; | |
361 for (int i = 0; i < hi_old - lo_old + 1; i++) { | |
362 int ofs_old = (int) Bytes::get_Java_u4(aligned_bcp_old + (3+i)*jintSize); | |
363 int ofs_new = (int) Bytes::get_Java_u4(aligned_bcp_new + (3+i)*jintSize); | |
364 _fwd_jmps->append(_s_old->bci() + ofs_old); | |
365 _fwd_jmps->append(_s_new->bci() + ofs_new); | |
366 } | |
367 } | |
368 } else { // !_switchable_test, can use fast rough compare | |
1565 | 369 int len_old = _s_old->instruction_size(); |
370 int len_new = _s_new->instruction_size(); | |
0 | 371 if (len_old != len_new) |
372 return false; | |
373 if (memcmp(_s_old->bcp(), _s_new->bcp(), len_old) != 0) | |
374 return false; | |
375 } | |
376 break; | |
377 } | |
378 } | |
379 | |
380 return true; | |
381 } | |
382 | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
383 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
|
384 constantTag tag_old = _old_cp->tag_at(cpi_old); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
385 constantTag tag_new = _new_cp->tag_at(cpi_new); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
386 if (tag_old.is_int() || tag_old.is_float()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
387 if (tag_old.value() != tag_new.value()) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
388 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
389 if (tag_old.is_int()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
390 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
|
391 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
392 } else { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
393 // 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
|
394 // This makes a difference for NaN constants. |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
395 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
|
396 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
397 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
398 } else if (tag_old.is_string() || tag_old.is_unresolved_string()) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
399 if (! (tag_new.is_unresolved_string() || tag_new.is_string())) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
400 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
401 if (strcmp(_old_cp->string_at_noresolve(cpi_old), |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
402 _new_cp->string_at_noresolve(cpi_new)) != 0) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
403 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
404 } 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
|
405 // tag_old should be klass - 4881222 |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
406 if (! (tag_new.is_unresolved_klass() || tag_new.is_klass())) |
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 if (_old_cp->klass_at_noresolve(cpi_old) != |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
409 _new_cp->klass_at_noresolve(cpi_new)) |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
410 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
411 } 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
|
412 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
|
413 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
|
414 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
|
415 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
416 } 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
|
417 if (_old_cp->method_handle_ref_kind_at(cpi_old) != |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
418 _new_cp->method_handle_ref_kind_at(cpi_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 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
|
421 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
|
422 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
|
423 (_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
|
424 (_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
|
425 return false; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
426 } else { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
427 return false; // unknown tag |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
428 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
429 return true; |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
430 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1602
diff
changeset
|
431 |
0 | 432 |
433 int MethodComparator::check_stack_and_locals_size(methodOop old_method, methodOop new_method) { | |
434 if (old_method->max_stack() != new_method->max_stack()) { | |
435 return 1; | |
436 } else if (old_method->max_locals() != new_method->max_locals()) { | |
437 return 2; | |
438 } else if (old_method->size_of_parameters() != new_method->size_of_parameters()) { | |
439 return 3; | |
440 } else return 0; | |
441 } |