hotspot/src/share/vm/ci/ciInstanceKlass.cpp
changeset 217 c646ef2f5d58
parent 1 489c9b5090e2
child 360 21d113ecbf6a
equal deleted inserted replaced
216:9d2d32d9828f 217:c646ef2f5d58
    32 
    32 
    33 // ------------------------------------------------------------------
    33 // ------------------------------------------------------------------
    34 // ciInstanceKlass::ciInstanceKlass
    34 // ciInstanceKlass::ciInstanceKlass
    35 //
    35 //
    36 // Loaded instance klass.
    36 // Loaded instance klass.
    37 ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) : ciKlass(h_k) {
    37 ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
       
    38   ciKlass(h_k), _non_static_fields(NULL)
       
    39 {
    38   assert(get_Klass()->oop_is_instance(), "wrong type");
    40   assert(get_Klass()->oop_is_instance(), "wrong type");
    39   instanceKlass* ik = get_instanceKlass();
    41   instanceKlass* ik = get_instanceKlass();
    40 
    42 
    41   AccessFlags access_flags = ik->access_flags();
    43   AccessFlags access_flags = ik->access_flags();
    42   _flags = ciFlags(access_flags);
    44   _flags = ciFlags(access_flags);
   331   if (!k->find_field_from_offset(field_offset, is_static, &fd)) {
   333   if (!k->find_field_from_offset(field_offset, is_static, &fd)) {
   332     return NULL;
   334     return NULL;
   333   }
   335   }
   334   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
   336   ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
   335   return field;
   337   return field;
       
   338 }
       
   339 
       
   340 // ------------------------------------------------------------------
       
   341 // ciInstanceKlass::non_static_fields.
       
   342 
       
   343 class NonStaticFieldFiller: public FieldClosure {
       
   344   GrowableArray<ciField*>* _arr;
       
   345   ciEnv* _curEnv;
       
   346 public:
       
   347   NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
       
   348     _curEnv(curEnv), _arr(arr)
       
   349   {}
       
   350   void do_field(fieldDescriptor* fd) {
       
   351     ciField* field = new (_curEnv->arena()) ciField(fd);
       
   352     _arr->append(field);
       
   353   }
       
   354 };
       
   355 
       
   356 GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
       
   357   if (_non_static_fields == NULL) {
       
   358     VM_ENTRY_MARK;
       
   359     ciEnv* curEnv = ciEnv::current();
       
   360     instanceKlass* ik = get_instanceKlass();
       
   361     int max_n_fields = ik->fields()->length()/instanceKlass::next_offset;
       
   362 
       
   363     _non_static_fields =
       
   364       new (curEnv->arena()) GrowableArray<ciField*>(max_n_fields);
       
   365     NonStaticFieldFiller filler(curEnv, _non_static_fields);
       
   366     ik->do_nonstatic_fields(&filler);
       
   367   }
       
   368   return _non_static_fields;
   336 }
   369 }
   337 
   370 
   338 static int sort_field_by_offset(ciField** a, ciField** b) {
   371 static int sort_field_by_offset(ciField** a, ciField** b) {
   339   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
   372   return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
   340   // (no worries about 32-bit overflow...)
   373   // (no worries about 32-bit overflow...)