260 return symbol_at(signature_index); |
260 return symbol_at(signature_index); |
261 } |
261 } |
262 |
262 |
263 |
263 |
264 int constantPoolOopDesc::impl_name_and_type_ref_index_at(int which, bool uncached) { |
264 int constantPoolOopDesc::impl_name_and_type_ref_index_at(int which, bool uncached) { |
265 jint ref_index = field_or_method_at(which, uncached); |
265 int i = which; |
|
266 if (!uncached && cache() != NULL) { |
|
267 if (constantPoolCacheOopDesc::is_secondary_index(which)) |
|
268 // Invokedynamic indexes are always processed in native order |
|
269 // so there is no question of reading a native u2 in Java order here. |
|
270 return cache()->main_entry_at(which)->constant_pool_index(); |
|
271 // change byte-ordering and go via cache |
|
272 i = remap_instruction_operand_from_cache(which); |
|
273 } else { |
|
274 if (tag_at(which).is_name_and_type()) |
|
275 // invokedynamic index is a simple name-and-type |
|
276 return which; |
|
277 } |
|
278 assert(tag_at(i).is_field_or_method(), "Corrupted constant pool"); |
|
279 jint ref_index = *int_at_addr(i); |
266 return extract_high_short_from_int(ref_index); |
280 return extract_high_short_from_int(ref_index); |
267 } |
281 } |
268 |
282 |
269 |
283 |
270 int constantPoolOopDesc::impl_klass_ref_index_at(int which, bool uncached) { |
284 int constantPoolOopDesc::impl_klass_ref_index_at(int which, bool uncached) { |
271 jint ref_index = field_or_method_at(which, uncached); |
285 guarantee(!constantPoolCacheOopDesc::is_secondary_index(which), |
|
286 "an invokedynamic instruction does not have a klass"); |
|
287 int i = which; |
|
288 if (!uncached && cache() != NULL) { |
|
289 // change byte-ordering and go via cache |
|
290 i = remap_instruction_operand_from_cache(which); |
|
291 } |
|
292 assert(tag_at(i).is_field_or_method(), "Corrupted constant pool"); |
|
293 jint ref_index = *int_at_addr(i); |
272 return extract_low_short_from_int(ref_index); |
294 return extract_low_short_from_int(ref_index); |
273 } |
295 } |
274 |
296 |
275 |
297 |
276 |
298 |
277 int constantPoolOopDesc::map_instruction_operand_to_index(int operand) { |
299 int constantPoolOopDesc::remap_instruction_operand_from_cache(int operand) { |
278 if (constantPoolCacheOopDesc::is_secondary_index(operand)) { |
300 // Operand was fetched by a stream using get_Java_u2, yet was stored |
279 return cache()->main_entry_at(operand)->constant_pool_index(); |
301 // by Rewriter::rewrite_member_reference in native order. |
280 } |
302 // So now we have to fix the damage by swapping back to native order. |
281 assert((int)(u2)operand == operand, "clean u2"); |
303 assert((int)(u2)operand == operand, "clean u2"); |
282 int index = Bytes::swap_u2(operand); |
304 int cpc_index = Bytes::swap_u2(operand); |
283 return cache()->entry_at(index)->constant_pool_index(); |
305 int member_index = cache()->entry_at(cpc_index)->constant_pool_index(); |
|
306 return member_index; |
284 } |
307 } |
285 |
308 |
286 |
309 |
287 void constantPoolOopDesc::verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle k, TRAPS) { |
310 void constantPoolOopDesc::verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle k, TRAPS) { |
288 if (k->oop_is_instance() || k->oop_is_objArray()) { |
311 if (k->oop_is_instance() || k->oop_is_objArray()) { |