hotspot/src/share/vm/oops/constantPoolOop.cpp
changeset 4429 d7eb4e2099aa
parent 2860 cf13b84eb2f9
child 4571 80b553bddc26
equal deleted inserted replaced
4428:d1617f46285d 4429:d7eb4e2099aa
   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()) {