< prev index next >

src/share/vm/oops/cpCache.cpp

Print this page




 372   }
 373 }
 374 
 375 Method* ConstantPoolCacheEntry::method_if_resolved(const constantPoolHandle& cpool) {
 376   // Decode the action of set_method and set_interface_call
 377   Bytecodes::Code invoke_code = bytecode_1();
 378   if (invoke_code != (Bytecodes::Code)0) {
 379     Metadata* f1 = f1_ord();
 380     if (f1 != NULL) {
 381       switch (invoke_code) {
 382       case Bytecodes::_invokeinterface:
 383         assert(f1->is_klass(), "");
 384         return klassItable::method_for_itable_index((Klass*)f1, f2_as_index());
 385       case Bytecodes::_invokestatic:
 386       case Bytecodes::_invokespecial:
 387         assert(!has_appendix(), "");
 388       case Bytecodes::_invokehandle:
 389       case Bytecodes::_invokedynamic:
 390         assert(f1->is_method(), "");
 391         return (Method*)f1;


 392       }
 393     }
 394   }
 395   invoke_code = bytecode_2();
 396   if (invoke_code != (Bytecodes::Code)0) {
 397     switch (invoke_code) {
 398     case Bytecodes::_invokevirtual:
 399       if (is_vfinal()) {
 400         // invokevirtual
 401         Method* m = f2_as_vfinal_method();
 402         assert(m->is_method(), "");
 403         return m;
 404       } else {
 405         int holder_index = cpool->uncached_klass_ref_index_at(constant_pool_index());
 406         if (cpool->tag_at(holder_index).is_klass()) {
 407           Klass* klass = cpool->resolved_klass_at(holder_index);
 408           return klass->method_at_vtable(f2_as_index());
 409         }
 410       }
 411       break;


 412     }
 413   }
 414   return NULL;
 415 }
 416 
 417 
 418 oop ConstantPoolCacheEntry::appendix_if_resolved(const constantPoolHandle& cpool) {
 419   if (!has_appendix())
 420     return NULL;
 421   const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset;
 422   objArrayOop resolved_references = cpool->resolved_references();
 423   return resolved_references->obj_at(ref_index);
 424 }
 425 
 426 
 427 oop ConstantPoolCacheEntry::method_type_if_resolved(const constantPoolHandle& cpool) {
 428   if (!has_method_type())
 429     return NULL;
 430   const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset;
 431   objArrayOop resolved_references = cpool->resolved_references();




 372   }
 373 }
 374 
 375 Method* ConstantPoolCacheEntry::method_if_resolved(const constantPoolHandle& cpool) {
 376   // Decode the action of set_method and set_interface_call
 377   Bytecodes::Code invoke_code = bytecode_1();
 378   if (invoke_code != (Bytecodes::Code)0) {
 379     Metadata* f1 = f1_ord();
 380     if (f1 != NULL) {
 381       switch (invoke_code) {
 382       case Bytecodes::_invokeinterface:
 383         assert(f1->is_klass(), "");
 384         return klassItable::method_for_itable_index((Klass*)f1, f2_as_index());
 385       case Bytecodes::_invokestatic:
 386       case Bytecodes::_invokespecial:
 387         assert(!has_appendix(), "");
 388       case Bytecodes::_invokehandle:
 389       case Bytecodes::_invokedynamic:
 390         assert(f1->is_method(), "");
 391         return (Method*)f1;
 392       default:
 393         break;
 394       }
 395     }
 396   }
 397   invoke_code = bytecode_2();
 398   if (invoke_code != (Bytecodes::Code)0) {
 399     switch (invoke_code) {
 400     case Bytecodes::_invokevirtual:
 401       if (is_vfinal()) {
 402         // invokevirtual
 403         Method* m = f2_as_vfinal_method();
 404         assert(m->is_method(), "");
 405         return m;
 406       } else {
 407         int holder_index = cpool->uncached_klass_ref_index_at(constant_pool_index());
 408         if (cpool->tag_at(holder_index).is_klass()) {
 409           Klass* klass = cpool->resolved_klass_at(holder_index);
 410           return klass->method_at_vtable(f2_as_index());
 411         }
 412       }
 413       break;
 414     default:
 415       break;
 416     }
 417   }
 418   return NULL;
 419 }
 420 
 421 
 422 oop ConstantPoolCacheEntry::appendix_if_resolved(const constantPoolHandle& cpool) {
 423   if (!has_appendix())
 424     return NULL;
 425   const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset;
 426   objArrayOop resolved_references = cpool->resolved_references();
 427   return resolved_references->obj_at(ref_index);
 428 }
 429 
 430 
 431 oop ConstantPoolCacheEntry::method_type_if_resolved(const constantPoolHandle& cpool) {
 432   if (!has_method_type())
 433     return NULL;
 434   const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset;
 435   objArrayOop resolved_references = cpool->resolved_references();


< prev index next >