hotspot/src/share/vm/oops/cpCacheOop.cpp
changeset 10008 d84de97ad847
parent 9328 144894b3384b
child 10546 e79347eebbc5
equal deleted inserted replaced
10007:43d4a6542551 10008:d84de97ad847
   293   //set_bytecode_1(Bytecodes::_invokedynamic);
   293   //set_bytecode_1(Bytecodes::_invokedynamic);
   294   set_f1_if_null_atomic(call_site());  // This must be the last one to set (see NOTE above)!
   294   set_f1_if_null_atomic(call_site());  // This must be the last one to set (see NOTE above)!
   295 }
   295 }
   296 
   296 
   297 
   297 
       
   298 methodOop ConstantPoolCacheEntry::get_method_if_resolved(Bytecodes::Code invoke_code, constantPoolHandle cpool) {
       
   299   assert(invoke_code > (Bytecodes::Code)0, "bad query");
       
   300   if (is_secondary_entry()) {
       
   301     return cpool->cache()->entry_at(main_entry_index())->get_method_if_resolved(invoke_code, cpool);
       
   302   }
       
   303   // Decode the action of set_method and set_interface_call
       
   304   if (bytecode_1() == invoke_code) {
       
   305     oop f1 = _f1;
       
   306     if (f1 != NULL) {
       
   307       switch (invoke_code) {
       
   308       case Bytecodes::_invokeinterface:
       
   309         assert(f1->is_klass(), "");
       
   310         return klassItable::method_for_itable_index(klassOop(f1), (int) f2());
       
   311       case Bytecodes::_invokestatic:
       
   312       case Bytecodes::_invokespecial:
       
   313         assert(f1->is_method(), "");
       
   314         return methodOop(f1);
       
   315       }
       
   316     }
       
   317   }
       
   318   if (bytecode_2() == invoke_code) {
       
   319     switch (invoke_code) {
       
   320     case Bytecodes::_invokevirtual:
       
   321       if (is_vfinal()) {
       
   322         // invokevirtual
       
   323         methodOop m = methodOop((intptr_t) f2());
       
   324         assert(m->is_method(), "");
       
   325         return m;
       
   326       } else {
       
   327         int holder_index = cpool->uncached_klass_ref_index_at(constant_pool_index());
       
   328         if (cpool->tag_at(holder_index).is_klass()) {
       
   329           klassOop klass = cpool->resolved_klass_at(holder_index);
       
   330           if (!Klass::cast(klass)->oop_is_instance())
       
   331             klass = SystemDictionary::Object_klass();
       
   332           return instanceKlass::cast(klass)->method_at_vtable((int) f2());
       
   333         }
       
   334       }
       
   335     }
       
   336   }
       
   337   return NULL;
       
   338 }
       
   339 
       
   340 
       
   341 
   298 class LocalOopClosure: public OopClosure {
   342 class LocalOopClosure: public OopClosure {
   299  private:
   343  private:
   300   void (*_f)(oop*);
   344   void (*_f)(oop*);
   301 
   345 
   302  public:
   346  public: