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(); |