hotspot/src/share/vm/ci/ciStreams.cpp
changeset 4567 7fc02fbe5c7a
parent 4566 b363f6ef4068
child 5688 9052dc91ea67
child 5547 f4b087cbb361
equal deleted inserted replaced
4566:b363f6ef4068 4567:7fc02fbe5c7a
   184 // ciBytecodeStream::get_klass
   184 // ciBytecodeStream::get_klass
   185 //
   185 //
   186 // If this bytecode is a new, newarray, multianewarray, instanceof,
   186 // If this bytecode is a new, newarray, multianewarray, instanceof,
   187 // or checkcast, get the referenced klass.
   187 // or checkcast, get the referenced klass.
   188 ciKlass* ciBytecodeStream::get_klass(bool& will_link) {
   188 ciKlass* ciBytecodeStream::get_klass(bool& will_link) {
   189   return CURRENT_ENV->get_klass_by_index(_holder, get_klass_index(),
   189   VM_ENTRY_MARK;
   190                                          will_link);
   190   constantPoolHandle cpool(_method->get_methodOop()->constants());
       
   191   return CURRENT_ENV->get_klass_by_index(cpool, get_klass_index(), will_link, _holder);
   191 }
   192 }
   192 
   193 
   193 // ------------------------------------------------------------------
   194 // ------------------------------------------------------------------
   194 // ciBytecodeStream::get_constant_index
   195 // ciBytecodeStream::get_constant_index
   195 //
   196 //
   211 // ciBytecodeStream::get_constant
   212 // ciBytecodeStream::get_constant
   212 //
   213 //
   213 // If this bytecode is one of the ldc variants, get the referenced
   214 // If this bytecode is one of the ldc variants, get the referenced
   214 // constant.
   215 // constant.
   215 ciConstant ciBytecodeStream::get_constant() {
   216 ciConstant ciBytecodeStream::get_constant() {
   216   return CURRENT_ENV->get_constant_by_index(_holder, get_constant_index());
   217   VM_ENTRY_MARK;
       
   218   constantPoolHandle cpool(_method->get_methodOop()->constants());
       
   219   return CURRENT_ENV->get_constant_by_index(cpool, get_constant_index(), _holder);
   217 }
   220 }
   218 
   221 
   219 // ------------------------------------------------------------------
   222 // ------------------------------------------------------------------
   220 bool ciBytecodeStream::is_unresolved_string() const {
   223 bool ciBytecodeStream::is_unresolved_string() const {
   221   return CURRENT_ENV->is_unresolved_string(_holder, get_constant_index());
   224   return CURRENT_ENV->is_unresolved_string(_holder, get_constant_index());
   262 // bytecodes.
   265 // bytecodes.
   263 //
   266 //
   264 // There is no "will_link" result passed back.  The user is responsible
   267 // There is no "will_link" result passed back.  The user is responsible
   265 // for checking linkability when retrieving the associated field.
   268 // for checking linkability when retrieving the associated field.
   266 ciInstanceKlass* ciBytecodeStream::get_declared_field_holder() {
   269 ciInstanceKlass* ciBytecodeStream::get_declared_field_holder() {
       
   270   VM_ENTRY_MARK;
       
   271   constantPoolHandle cpool(_method->get_methodOop()->constants());
   267   int holder_index = get_field_holder_index();
   272   int holder_index = get_field_holder_index();
   268   bool ignore;
   273   bool ignore;
   269   return CURRENT_ENV->get_klass_by_index(_holder, holder_index, ignore)
   274   return CURRENT_ENV->get_klass_by_index(cpool, holder_index, ignore, _holder)
   270       ->as_instance_klass();
   275       ->as_instance_klass();
   271 }
   276 }
   272 
   277 
   273 // ------------------------------------------------------------------
   278 // ------------------------------------------------------------------
   274 // ciBytecodeStream::get_field_holder_index
   279 // ciBytecodeStream::get_field_holder_index
   275 //
   280 //
   276 // Get the constant pool index of the declared holder of the field
   281 // Get the constant pool index of the declared holder of the field
   277 // referenced by the current bytecode.  Used for generating
   282 // referenced by the current bytecode.  Used for generating
   278 // deoptimization information.
   283 // deoptimization information.
   279 int ciBytecodeStream::get_field_holder_index() {
   284 int ciBytecodeStream::get_field_holder_index() {
   280   VM_ENTRY_MARK;
   285   GUARDED_VM_ENTRY(
   281   constantPoolOop cpool = _holder->get_instanceKlass()->constants();
   286     constantPoolOop cpool = _holder->get_instanceKlass()->constants();
   282   return cpool->klass_ref_index_at(get_field_index());
   287     return cpool->klass_ref_index_at(get_field_index());
       
   288   )
   283 }
   289 }
   284 
   290 
   285 // ------------------------------------------------------------------
   291 // ------------------------------------------------------------------
   286 // ciBytecodeStream::get_field_signature_index
   292 // ciBytecodeStream::get_field_signature_index
   287 //
   293 //
   319 // ------------------------------------------------------------------
   325 // ------------------------------------------------------------------
   320 // ciBytecodeStream::get_method
   326 // ciBytecodeStream::get_method
   321 //
   327 //
   322 // If this is a method invocation bytecode, get the invoked method.
   328 // If this is a method invocation bytecode, get the invoked method.
   323 ciMethod* ciBytecodeStream::get_method(bool& will_link) {
   329 ciMethod* ciBytecodeStream::get_method(bool& will_link) {
   324   ciMethod* m = CURRENT_ENV->get_method_by_index(_holder, get_method_index(), cur_bc());
   330   VM_ENTRY_MARK;
       
   331   constantPoolHandle cpool(_method->get_methodOop()->constants());
       
   332   ciMethod* m = CURRENT_ENV->get_method_by_index(cpool, get_method_index(), cur_bc(), _holder);
   325   will_link = m->is_loaded();
   333   will_link = m->is_loaded();
   326   return m;
   334   return m;
   327 }
   335 }
   328 
   336 
   329 // ------------------------------------------------------------------
   337 // ------------------------------------------------------------------
   336 // bytecodes.
   344 // bytecodes.
   337 //
   345 //
   338 // There is no "will_link" result passed back.  The user is responsible
   346 // There is no "will_link" result passed back.  The user is responsible
   339 // for checking linkability when retrieving the associated method.
   347 // for checking linkability when retrieving the associated method.
   340 ciKlass* ciBytecodeStream::get_declared_method_holder() {
   348 ciKlass* ciBytecodeStream::get_declared_method_holder() {
       
   349   VM_ENTRY_MARK;
       
   350   constantPoolHandle cpool(_method->get_methodOop()->constants());
   341   bool ignore;
   351   bool ignore;
   342   // report as InvokeDynamic for invokedynamic, which is syntactically classless
   352   // report as InvokeDynamic for invokedynamic, which is syntactically classless
   343   if (cur_bc() == Bytecodes::_invokedynamic)
   353   if (cur_bc() == Bytecodes::_invokedynamic)
   344     return CURRENT_ENV->get_klass_by_name(_holder, ciSymbol::java_dyn_InvokeDynamic(), false);
   354     return CURRENT_ENV->get_klass_by_name(_holder, ciSymbol::java_dyn_InvokeDynamic(), false);
   345   return CURRENT_ENV->get_klass_by_index(_holder, get_method_holder_index(), ignore);
   355   return CURRENT_ENV->get_klass_by_index(cpool, get_method_holder_index(), ignore, _holder);
   346 }
   356 }
   347 
   357 
   348 // ------------------------------------------------------------------
   358 // ------------------------------------------------------------------
   349 // ciBytecodeStream::get_method_holder_index
   359 // ciBytecodeStream::get_method_holder_index
   350 //
   360 //
   351 // Get the constant pool index of the declared holder of the method
   361 // Get the constant pool index of the declared holder of the method
   352 // referenced by the current bytecode.  Used for generating
   362 // referenced by the current bytecode.  Used for generating
   353 // deoptimization information.
   363 // deoptimization information.
   354 int ciBytecodeStream::get_method_holder_index() {
   364 int ciBytecodeStream::get_method_holder_index() {
   355   VM_ENTRY_MARK;
   365   constantPoolOop cpool = _method->get_methodOop()->constants();
   356   constantPoolOop cpool = _holder->get_instanceKlass()->constants();
       
   357   return cpool->klass_ref_index_at(get_method_index());
   366   return cpool->klass_ref_index_at(get_method_index());
   358 }
   367 }
   359 
   368 
   360 // ------------------------------------------------------------------
   369 // ------------------------------------------------------------------
   361 // ciBytecodeStream::get_method_signature_index
   370 // ciBytecodeStream::get_method_signature_index
   379   constantPoolOop      cpool   = _holder->get_instanceKlass()->constants();
   388   constantPoolOop      cpool   = _holder->get_instanceKlass()->constants();
   380   constantPoolCacheOop cpcache = cpool->cache();
   389   constantPoolCacheOop cpcache = cpool->cache();
   381 
   390 
   382   return CURRENT_ENV->get_object(cpcache)->as_cpcache();
   391   return CURRENT_ENV->get_object(cpcache)->as_cpcache();
   383 }
   392 }
       
   393 
       
   394 // ------------------------------------------------------------------
       
   395 // ciBytecodeStream::get_call_site
       
   396 ciCallSite* ciBytecodeStream::get_call_site() {
       
   397   VM_ENTRY_MARK;
       
   398   // Get the constant pool.
       
   399   constantPoolOop      cpool   = _holder->get_instanceKlass()->constants();
       
   400   constantPoolCacheOop cpcache = cpool->cache();
       
   401 
       
   402   // Get the CallSite from the constant pool cache.
       
   403   int method_index = get_method_index();
       
   404   ConstantPoolCacheEntry* cpcache_entry = cpcache->secondary_entry_at(method_index);
       
   405   oop call_site_oop = cpcache_entry->f1();
       
   406 
       
   407   // Create a CallSite object and return it.
       
   408   return CURRENT_ENV->get_object(call_site_oop)->as_call_site();
       
   409 }