src/share/vm/oops/cpCacheOop.cpp

changeset 2982
ddd894528dbc
parent 2811
08ccee2c4dbf
child 3137
e6b1331a51d2
     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*);

mercurial