1 /* |
1 /* |
2 * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. 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. |
79 // The class is used to iterate over the bytecodes of a method. |
79 // The class is used to iterate over the bytecodes of a method. |
80 // It hides the details of constant pool structure/access by |
80 // It hides the details of constant pool structure/access by |
81 // providing accessors for constant pool items. |
81 // providing accessors for constant pool items. |
82 |
82 |
83 // ------------------------------------------------------------------ |
83 // ------------------------------------------------------------------ |
84 // ciBytecodeStream::wide |
84 // ciBytecodeStream::next_wide_or_table |
85 // |
|
86 // Special handling for the wide bytcode |
|
87 Bytecodes::Code ciBytecodeStream::wide() |
|
88 { |
|
89 // Get following bytecode; do not return wide |
|
90 Bytecodes::Code bc = (Bytecodes::Code)_pc[1]; |
|
91 _pc += 2; // Skip both bytecodes |
|
92 _pc += 2; // Skip index always |
|
93 if( bc == Bytecodes::_iinc ) |
|
94 _pc += 2; // Skip optional constant |
|
95 _was_wide = _pc; // Flag last wide bytecode found |
|
96 return bc; |
|
97 } |
|
98 |
|
99 // ------------------------------------------------------------------ |
|
100 // ciBytecodeStream::table |
|
101 // |
85 // |
102 // Special handling for switch ops |
86 // Special handling for switch ops |
103 Bytecodes::Code ciBytecodeStream::table( Bytecodes::Code bc ) { |
87 Bytecodes::Code ciBytecodeStream::next_wide_or_table(Bytecodes::Code bc) { |
104 switch( bc ) { // Check for special bytecode handling |
88 switch (bc) { // Check for special bytecode handling |
|
89 case Bytecodes::_wide: |
|
90 // Special handling for the wide bytcode |
|
91 // Get following bytecode; do not return wide |
|
92 assert(Bytecodes::Code(_pc[0]) == Bytecodes::_wide, ""); |
|
93 bc = Bytecodes::java_code(_raw_bc = (Bytecodes::Code)_pc[1]); |
|
94 assert(Bytecodes::wide_length_for(bc) > 2, "must make progress"); |
|
95 _pc += Bytecodes::wide_length_for(bc); |
|
96 _was_wide = _pc; // Flag last wide bytecode found |
|
97 assert(is_wide(), "accessor works right"); |
|
98 break; |
105 |
99 |
106 case Bytecodes::_lookupswitch: |
100 case Bytecodes::_lookupswitch: |
107 _pc++; // Skip wide bytecode |
101 _pc++; // Skip wide bytecode |
108 _pc += (_start-_pc)&3; // Word align |
102 _pc += (_start-_pc)&3; // Word align |
109 _table_base = (jint*)_pc; // Capture for later usage |
103 _table_base = (jint*)_pc; // Capture for later usage |
162 // If this bytecodes references a klass, return the index of the |
156 // If this bytecodes references a klass, return the index of the |
163 // referenced klass. |
157 // referenced klass. |
164 int ciBytecodeStream::get_klass_index() const { |
158 int ciBytecodeStream::get_klass_index() const { |
165 switch(cur_bc()) { |
159 switch(cur_bc()) { |
166 case Bytecodes::_ldc: |
160 case Bytecodes::_ldc: |
167 return get_index(); |
161 return get_index_u1(); |
168 case Bytecodes::_ldc_w: |
162 case Bytecodes::_ldc_w: |
169 case Bytecodes::_ldc2_w: |
163 case Bytecodes::_ldc2_w: |
170 case Bytecodes::_checkcast: |
164 case Bytecodes::_checkcast: |
171 case Bytecodes::_instanceof: |
165 case Bytecodes::_instanceof: |
172 case Bytecodes::_anewarray: |
166 case Bytecodes::_anewarray: |
173 case Bytecodes::_multianewarray: |
167 case Bytecodes::_multianewarray: |
174 case Bytecodes::_new: |
168 case Bytecodes::_new: |
175 case Bytecodes::_newarray: |
169 case Bytecodes::_newarray: |
176 return get_index_big(); |
170 return get_index_u2(); |
177 default: |
171 default: |
178 ShouldNotReachHere(); |
172 ShouldNotReachHere(); |
179 return 0; |
173 return 0; |
180 } |
174 } |
181 } |
175 } |
197 // If this bytecode is one of the ldc variants, get the index of the |
191 // If this bytecode is one of the ldc variants, get the index of the |
198 // referenced constant. |
192 // referenced constant. |
199 int ciBytecodeStream::get_constant_index() const { |
193 int ciBytecodeStream::get_constant_index() const { |
200 switch(cur_bc()) { |
194 switch(cur_bc()) { |
201 case Bytecodes::_ldc: |
195 case Bytecodes::_ldc: |
202 return get_index(); |
196 return get_index_u1(); |
203 case Bytecodes::_ldc_w: |
197 case Bytecodes::_ldc_w: |
204 case Bytecodes::_ldc2_w: |
198 case Bytecodes::_ldc2_w: |
205 return get_index_big(); |
199 return get_index_u2(); |
206 default: |
200 default: |
207 ShouldNotReachHere(); |
201 ShouldNotReachHere(); |
208 return 0; |
202 return 0; |
209 } |
203 } |
210 } |
204 } |
237 int ciBytecodeStream::get_field_index() { |
231 int ciBytecodeStream::get_field_index() { |
238 assert(cur_bc() == Bytecodes::_getfield || |
232 assert(cur_bc() == Bytecodes::_getfield || |
239 cur_bc() == Bytecodes::_putfield || |
233 cur_bc() == Bytecodes::_putfield || |
240 cur_bc() == Bytecodes::_getstatic || |
234 cur_bc() == Bytecodes::_getstatic || |
241 cur_bc() == Bytecodes::_putstatic, "wrong bc"); |
235 cur_bc() == Bytecodes::_putstatic, "wrong bc"); |
242 return get_index_big(); |
236 return get_index_u2_cpcache(); |
243 } |
237 } |
244 |
238 |
245 |
239 |
246 // ------------------------------------------------------------------ |
240 // ------------------------------------------------------------------ |
247 // ciBytecodeStream::get_field |
241 // ciBytecodeStream::get_field |