1.1 --- a/src/share/vm/oops/cpCacheOop.cpp Wed Jun 22 14:45:37 2011 -0700 1.2 +++ b/src/share/vm/oops/cpCacheOop.cpp Thu Jun 23 17:14:06 2011 -0700 1.3 @@ -295,6 +295,50 @@ 1.4 } 1.5 1.6 1.7 +methodOop ConstantPoolCacheEntry::get_method_if_resolved(Bytecodes::Code invoke_code, constantPoolHandle cpool) { 1.8 + assert(invoke_code > (Bytecodes::Code)0, "bad query"); 1.9 + if (is_secondary_entry()) { 1.10 + return cpool->cache()->entry_at(main_entry_index())->get_method_if_resolved(invoke_code, cpool); 1.11 + } 1.12 + // Decode the action of set_method and set_interface_call 1.13 + if (bytecode_1() == invoke_code) { 1.14 + oop f1 = _f1; 1.15 + if (f1 != NULL) { 1.16 + switch (invoke_code) { 1.17 + case Bytecodes::_invokeinterface: 1.18 + assert(f1->is_klass(), ""); 1.19 + return klassItable::method_for_itable_index(klassOop(f1), (int) f2()); 1.20 + case Bytecodes::_invokestatic: 1.21 + case Bytecodes::_invokespecial: 1.22 + assert(f1->is_method(), ""); 1.23 + return methodOop(f1); 1.24 + } 1.25 + } 1.26 + } 1.27 + if (bytecode_2() == invoke_code) { 1.28 + switch (invoke_code) { 1.29 + case Bytecodes::_invokevirtual: 1.30 + if (is_vfinal()) { 1.31 + // invokevirtual 1.32 + methodOop m = methodOop((intptr_t) f2()); 1.33 + assert(m->is_method(), ""); 1.34 + return m; 1.35 + } else { 1.36 + int holder_index = cpool->uncached_klass_ref_index_at(constant_pool_index()); 1.37 + if (cpool->tag_at(holder_index).is_klass()) { 1.38 + klassOop klass = cpool->resolved_klass_at(holder_index); 1.39 + if (!Klass::cast(klass)->oop_is_instance()) 1.40 + klass = SystemDictionary::Object_klass(); 1.41 + return instanceKlass::cast(klass)->method_at_vtable((int) f2()); 1.42 + } 1.43 + } 1.44 + } 1.45 + } 1.46 + return NULL; 1.47 +} 1.48 + 1.49 + 1.50 + 1.51 class LocalOopClosure: public OopClosure { 1.52 private: 1.53 void (*_f)(oop*);