annotate src/share/vm/interpreter/bytecode.cpp @ 1716:be3f9c242c9d

6948538: CMS: BOT walkers can fall into object allocation and initialization cracks Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode. Reviewed-by: chrisphi, johnc, poonam
author ysr
date Mon, 16 Aug 2010 15:58:42 -0700
parents 136b78722a08
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1579
jrose
parents: 1552 1574
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
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: 1135
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_bytecode.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Implementation of Bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
29
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
30 bool Bytecode::check_must_rewrite(Bytecodes::Code code) const {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
31 assert(Bytecodes::can_rewrite(code), "post-check only");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Some codes are conditionally rewriting. Look closely at them.
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
34 switch (code) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 case Bytecodes::_aload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // Even if RewriteFrequentPairs is turned on,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // the _aload_0 code might delay its rewrite until
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // a following _getfield rewrites itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
39 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
42 return false; // the rewrite is not done by the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 case Bytecodes::_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // (Could actually look at the class here, but the profit would be small.)
a61af66fc99e Initial load
duke
parents:
diff changeset
46 return false; // the rewrite is not always done
a61af66fc99e Initial load
duke
parents:
diff changeset
47 }
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // No other special cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
54 #ifdef ASSERT
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
55
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
56 void Bytecode::assert_same_format_as(Bytecodes::Code testbc, bool is_wide) const {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
57 Bytecodes::Code thisbc = Bytecodes::cast(byte_at(0));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
58 if (thisbc == Bytecodes::_breakpoint) return; // let the assertion fail silently
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
59 if (is_wide) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
60 assert(thisbc == Bytecodes::_wide, "expected a wide instruction");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
61 thisbc = Bytecodes::cast(byte_at(1));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
62 if (thisbc == Bytecodes::_breakpoint) return;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
63 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
64 int thisflags = Bytecodes::flags(testbc, is_wide) & Bytecodes::_all_fmt_bits;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
65 int testflags = Bytecodes::flags(thisbc, is_wide) & Bytecodes::_all_fmt_bits;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
66 if (thisflags != testflags)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
67 tty->print_cr("assert_same_format_as(%d) failed on bc=%d%s; %d != %d",
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
68 (int)testbc, (int)thisbc, (is_wide?"/wide":""), testflags, thisflags);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
69 assert(thisflags == testflags, "expected format");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
70 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
71
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
72 void Bytecode::assert_index_size(int size, Bytecodes::Code bc, bool is_wide) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
73 int have_fmt = (Bytecodes::flags(bc, is_wide)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
74 & (Bytecodes::_fmt_has_u2 | Bytecodes::_fmt_has_u4 |
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
75 Bytecodes::_fmt_not_simple |
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
76 // Not an offset field:
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
77 Bytecodes::_fmt_has_o));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
78 int need_fmt = -1;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
79 switch (size) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
80 case 1: need_fmt = 0; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
81 case 2: need_fmt = Bytecodes::_fmt_has_u2; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
82 case 4: need_fmt = Bytecodes::_fmt_has_u4; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
83 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
84 if (is_wide) need_fmt |= Bytecodes::_fmt_not_simple;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
85 if (have_fmt != need_fmt) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
86 tty->print_cr("assert_index_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
87 assert(have_fmt == need_fmt, "assert_index_size");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
88 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
89 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
90
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
91 void Bytecode::assert_offset_size(int size, Bytecodes::Code bc, bool is_wide) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
92 int have_fmt = Bytecodes::flags(bc, is_wide) & Bytecodes::_all_fmt_bits;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
93 int need_fmt = -1;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
94 switch (size) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
95 case 2: need_fmt = Bytecodes::_fmt_bo2; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
96 case 4: need_fmt = Bytecodes::_fmt_bo4; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
97 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
98 if (is_wide) need_fmt |= Bytecodes::_fmt_not_simple;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
99 if (have_fmt != need_fmt) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
100 tty->print_cr("assert_offset_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
101 assert(have_fmt == need_fmt, "assert_offset_size");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
102 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
103 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
104
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
105 void Bytecode::assert_constant_size(int size, int where, Bytecodes::Code bc, bool is_wide) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
106 int have_fmt = Bytecodes::flags(bc, is_wide) & (Bytecodes::_all_fmt_bits
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
107 // Ignore any 'i' field (for iinc):
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
108 & ~Bytecodes::_fmt_has_i);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
109 int need_fmt = -1;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
110 switch (size) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
111 case 1: need_fmt = Bytecodes::_fmt_bc; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
112 case 2: need_fmt = Bytecodes::_fmt_bc | Bytecodes::_fmt_has_u2; break;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
113 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
114 if (is_wide) need_fmt |= Bytecodes::_fmt_not_simple;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
115 int length = is_wide ? Bytecodes::wide_length_for(bc) : Bytecodes::length_for(bc);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
116 if (have_fmt != need_fmt || where + size != length) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
117 tty->print_cr("assert_constant_size %d @%d: bc=%d%s %d != %d", size, where, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
118 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
119 assert(have_fmt == need_fmt, "assert_constant_size");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
120 assert(where + size == length, "assert_constant_size oob");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
121 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
122
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
123 void Bytecode::assert_native_index(Bytecodes::Code bc, bool is_wide) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
124 assert((Bytecodes::flags(bc, is_wide) & Bytecodes::_fmt_has_nbo) != 0, "native index");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
125 }
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
126
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
127 #endif //ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Implementation of Bytecode_tableupswitch
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 int Bytecode_tableswitch::dest_offset_at(int i) const {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
132 return get_Java_u4_at(aligned_offset(1 + (3 + i)*jintSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Implementation of Bytecode_invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 void Bytecode_invoke::verify() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 assert(is_valid(), "check invoke");
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1135
diff changeset
140 assert(method()->constants()->cache() != NULL, "do not call this from verifier or rewriter");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
144 symbolOop Bytecode_member_ref::signature() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 constantPoolOop constants = method()->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return constants->signature_ref_at(index());
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
150 symbolOop Bytecode_member_ref::name() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
151 constantPoolOop constants = method()->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return constants->name_ref_at(index());
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
156 BasicType Bytecode_member_ref::result_type(Thread *thread) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 symbolHandle sh(thread, signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
158 ResultTypeFinder rts(sh);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 rts.iterate();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 return rts.type();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 methodHandle Bytecode_invoke::static_target(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 methodHandle m;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 KlassHandle resolved_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 constantPoolHandle constants(THREAD, _method->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
168
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
169 if (java_code() == Bytecodes::_invokedynamic) {
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 844
diff changeset
170 LinkResolver::resolve_dynamic_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
171 } else if (java_code() != Bytecodes::_invokeinterface) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 LinkResolver::resolve_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
a61af66fc99e Initial load
duke
parents:
diff changeset
173 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 LinkResolver::resolve_interface_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
180 int Bytecode_member_ref::index() const {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
181 // Note: Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
182 // at the same time it allocates per-call-site CP cache entries.
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
183 Bytecodes::Code rawc = code();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
184 Bytecode* invoke = bytecode();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
185 if (invoke->has_index_u4(rawc))
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
186 return invoke->get_index_u4(rawc);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
187 else
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
188 return invoke->get_index_u2_cpcache(rawc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
191 int Bytecode_member_ref::pool_index() const {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
192 int index = this->index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
193 DEBUG_ONLY({
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
194 if (!bytecode()->has_index_u4(code()))
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
195 index -= constantPoolOopDesc::CPCACHE_INDEX_TAG;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
196 });
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
197 return _method->constants()->cache()->entry_at(index)->constant_pool_index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
198 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Implementation of Bytecode_field
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void Bytecode_field::verify() const {
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
203 assert(is_valid(), "check field");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
207 // Implementation of Bytecode_loadconstant
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
208
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
209 int Bytecode_loadconstant::raw_index() const {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
210 Bytecode* bcp = bytecode();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
211 Bytecodes::Code rawc = bcp->code();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
212 assert(rawc != Bytecodes::_wide, "verifier prevents this");
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
213 if (Bytecodes::java_code(rawc) == Bytecodes::_ldc)
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
214 return bcp->get_index_u1(rawc);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
215 else
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
216 return bcp->get_index_u2(rawc, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
219 int Bytecode_loadconstant::pool_index() const {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
220 int index = raw_index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
221 if (has_cache_index()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
222 return _method->constants()->cache()->entry_at(index)->constant_pool_index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
223 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
224 return index;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
225 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
227 BasicType Bytecode_loadconstant::result_type() const {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
228 int index = pool_index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
229 constantTag tag = _method->constants()->tag_at(index);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
230 return tag.basic_type();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
231 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
232
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
233 oop Bytecode_loadconstant::resolve_constant(TRAPS) const {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
234 assert(_method.not_null(), "must supply method to resolve constant");
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
235 int index = raw_index();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
236 constantPoolOop constants = _method->constants();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
237 if (has_cache_index()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
238 return constants->resolve_cached_constant_at(index, THREAD);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
239 } else {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
240 return constants->resolve_constant_at(index, THREAD);
1574
1eb493f33423 6957080: MethodComparator needs stress testing
jrose
parents: 1565
diff changeset
241 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 //------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void Bytecode_lookupswitch::verify() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 switch (Bytecodes::java_code(code())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
252 { int i = number_of_pairs() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 while (i-- > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 assert(pair_at(i)->match() < pair_at(i+1)->match(), "unsorted table entries");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 fatal("not a lookupswitch bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void Bytecode_tableswitch::verify() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 switch (Bytecodes::java_code(code())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
266 { int lo = low_key();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 int hi = high_key();
a61af66fc99e Initial load
duke
parents:
diff changeset
268 assert (hi >= lo, "incorrect hi/lo values in tableswitch");
a61af66fc99e Initial load
duke
parents:
diff changeset
269 int i = hi - lo - 1 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 while (i-- > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // no special check needed
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 fatal("not a tableswitch bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #endif