src/share/vm/ci/ciInstanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File JDK-8058452 Sdiff src/share/vm/ci

src/share/vm/ci/ciInstanceKlass.cpp

Print this page




  27 #include "ci/ciInstance.hpp"
  28 #include "ci/ciInstanceKlass.hpp"
  29 #include "ci/ciUtilities.hpp"
  30 #include "classfile/systemDictionary.hpp"
  31 #include "memory/allocation.hpp"
  32 #include "memory/allocation.inline.hpp"
  33 #include "oops/oop.inline.hpp"
  34 #include "oops/fieldStreams.hpp"
  35 #include "runtime/fieldDescriptor.hpp"
  36 
  37 // ciInstanceKlass
  38 //
  39 // This class represents a Klass* in the HotSpot virtual machine
  40 // whose Klass part in an InstanceKlass.
  41 
  42 // ------------------------------------------------------------------
  43 // ciInstanceKlass::ciInstanceKlass
  44 //
  45 // Loaded instance klass.
  46 ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
  47   ciKlass(h_k), _non_static_fields(NULL)
  48 {
  49   assert(get_Klass()->oop_is_instance(), "wrong type");
  50   assert(get_instanceKlass()->is_loaded(), "must be at least loaded");
  51   InstanceKlass* ik = get_instanceKlass();
  52 
  53   AccessFlags access_flags = ik->access_flags();
  54   _flags = ciFlags(access_flags);
  55   _has_finalizer = access_flags.has_finalizer();
  56   _has_subklass = ik->subklass() != NULL;
  57   _init_state = ik->init_state();
  58   _nonstatic_field_size = ik->nonstatic_field_size();
  59   _has_nonstatic_fields = ik->has_nonstatic_fields();
  60   _has_default_methods = ik->has_default_methods();
  61   _nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
  62 
  63   _implementor = NULL; // we will fill these lazily
  64 
  65   Thread *thread = Thread::current();
  66   if (ciObjectFactory::is_initialized()) {
  67     _loader = JNIHandles::make_local(thread, ik->class_loader());


 390     return NULL;
 391   }
 392   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 393   return field;
 394 }
 395 
 396 // ------------------------------------------------------------------
 397 // ciInstanceKlass::get_field_by_name
 398 ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static) {
 399   VM_ENTRY_MARK;
 400   InstanceKlass* k = get_instanceKlass();
 401   fieldDescriptor fd;
 402   Klass* def = k->find_field(name->get_symbol(), signature->get_symbol(), is_static, &fd);
 403   if (def == NULL) {
 404     return NULL;
 405   }
 406   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 407   return field;
 408 }
 409 
 410 // ------------------------------------------------------------------
 411 // ciInstanceKlass::non_static_fields.
 412 
 413 class NonStaticFieldFiller: public FieldClosure {
 414   GrowableArray<ciField*>* _arr;
 415   ciEnv* _curEnv;
 416 public:
 417   NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
 418     _curEnv(curEnv), _arr(arr)
 419   {}
 420   void do_field(fieldDescriptor* fd) {
 421     ciField* field = new (_curEnv->arena()) ciField(fd);
 422     _arr->append(field);
 423   }
 424 };
 425 
 426 GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
 427   if (_non_static_fields == NULL) {
 428     VM_ENTRY_MARK;
 429     ciEnv* curEnv = ciEnv::current();
 430     InstanceKlass* ik = get_instanceKlass();
 431     int max_n_fields = ik->java_fields_count();
 432 
 433     Arena* arena = curEnv->arena();
 434     _non_static_fields =
 435       new (arena) GrowableArray<ciField*>(arena, max_n_fields, 0, NULL);
 436     NonStaticFieldFiller filler(curEnv, _non_static_fields);
 437     ik->do_nonstatic_fields(&filler);
 438   }
 439   return _non_static_fields;
 440 }
 441 
 442 static int sort_field_by_offset(ciField** a, ciField** b) {
 443   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
 444   // (no worries about 32-bit overflow...)
 445 }
 446 
 447 // ------------------------------------------------------------------
 448 // ciInstanceKlass::compute_nonstatic_fields
 449 int ciInstanceKlass::compute_nonstatic_fields() {
 450   assert(is_loaded(), "must be loaded");
 451 
 452   if (_nonstatic_fields != NULL)
 453     return _nonstatic_fields->length();
 454 
 455   if (!has_nonstatic_fields()) {
 456     Arena* arena = CURRENT_ENV->arena();
 457     _nonstatic_fields = new (arena) GrowableArray<ciField*>(arena, 0, 0, NULL);
 458     return 0;
 459   }
 460   assert(!is_java_lang_Object(), "bootstrap OK");




  27 #include "ci/ciInstance.hpp"
  28 #include "ci/ciInstanceKlass.hpp"
  29 #include "ci/ciUtilities.hpp"
  30 #include "classfile/systemDictionary.hpp"
  31 #include "memory/allocation.hpp"
  32 #include "memory/allocation.inline.hpp"
  33 #include "oops/oop.inline.hpp"
  34 #include "oops/fieldStreams.hpp"
  35 #include "runtime/fieldDescriptor.hpp"
  36 
  37 // ciInstanceKlass
  38 //
  39 // This class represents a Klass* in the HotSpot virtual machine
  40 // whose Klass part in an InstanceKlass.
  41 
  42 // ------------------------------------------------------------------
  43 // ciInstanceKlass::ciInstanceKlass
  44 //
  45 // Loaded instance klass.
  46 ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
  47   ciKlass(h_k)
  48 {
  49   assert(get_Klass()->oop_is_instance(), "wrong type");
  50   assert(get_instanceKlass()->is_loaded(), "must be at least loaded");
  51   InstanceKlass* ik = get_instanceKlass();
  52 
  53   AccessFlags access_flags = ik->access_flags();
  54   _flags = ciFlags(access_flags);
  55   _has_finalizer = access_flags.has_finalizer();
  56   _has_subklass = ik->subklass() != NULL;
  57   _init_state = ik->init_state();
  58   _nonstatic_field_size = ik->nonstatic_field_size();
  59   _has_nonstatic_fields = ik->has_nonstatic_fields();
  60   _has_default_methods = ik->has_default_methods();
  61   _nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
  62 
  63   _implementor = NULL; // we will fill these lazily
  64 
  65   Thread *thread = Thread::current();
  66   if (ciObjectFactory::is_initialized()) {
  67     _loader = JNIHandles::make_local(thread, ik->class_loader());


 390     return NULL;
 391   }
 392   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 393   return field;
 394 }
 395 
 396 // ------------------------------------------------------------------
 397 // ciInstanceKlass::get_field_by_name
 398 ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static) {
 399   VM_ENTRY_MARK;
 400   InstanceKlass* k = get_instanceKlass();
 401   fieldDescriptor fd;
 402   Klass* def = k->find_field(name->get_symbol(), signature->get_symbol(), is_static, &fd);
 403   if (def == NULL) {
 404     return NULL;
 405   }
 406   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
 407   return field;
 408 }
 409 































 410 
 411 static int sort_field_by_offset(ciField** a, ciField** b) {
 412   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
 413   // (no worries about 32-bit overflow...)
 414 }
 415 
 416 // ------------------------------------------------------------------
 417 // ciInstanceKlass::compute_nonstatic_fields
 418 int ciInstanceKlass::compute_nonstatic_fields() {
 419   assert(is_loaded(), "must be loaded");
 420 
 421   if (_nonstatic_fields != NULL)
 422     return _nonstatic_fields->length();
 423 
 424   if (!has_nonstatic_fields()) {
 425     Arena* arena = CURRENT_ENV->arena();
 426     _nonstatic_fields = new (arena) GrowableArray<ciField*>(arena, 0, 0, NULL);
 427     return 0;
 428   }
 429   assert(!is_java_lang_Object(), "bootstrap OK");


src/share/vm/ci/ciInstanceKlass.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File