386 class NonStaticFieldFiller: public FieldClosure {
387 GrowableArray<ciField*>* _arr;
388 ciEnv* _curEnv;
389 public:
390 NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
391 _curEnv(curEnv), _arr(arr)
392 {}
393 void do_field(fieldDescriptor* fd) {
394 ciField* field = new (_curEnv->arena()) ciField(fd);
395 _arr->append(field);
396 }
397 };
398
399 GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
400 if (_non_static_fields == NULL) {
401 VM_ENTRY_MARK;
402 ciEnv* curEnv = ciEnv::current();
403 instanceKlass* ik = get_instanceKlass();
404 int max_n_fields = ik->fields()->length()/instanceKlass::next_offset;
405
406 _non_static_fields =
407 new (curEnv->arena()) GrowableArray<ciField*>(max_n_fields);
408 NonStaticFieldFiller filler(curEnv, _non_static_fields);
409 ik->do_nonstatic_fields(&filler);
410 }
411 return _non_static_fields;
412 }
413
414 static int sort_field_by_offset(ciField** a, ciField** b) {
415 return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
416 // (no worries about 32-bit overflow...)
417 }
418
419 // ------------------------------------------------------------------
420 // ciInstanceKlass::compute_nonstatic_fields
421 int ciInstanceKlass::compute_nonstatic_fields() {
422 assert(is_loaded(), "must be loaded");
423
424 if (_nonstatic_fields != NULL)
425 return _nonstatic_fields->length();
426
427 if (!has_nonstatic_fields()) {
|
386 class NonStaticFieldFiller: public FieldClosure {
387 GrowableArray<ciField*>* _arr;
388 ciEnv* _curEnv;
389 public:
390 NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
391 _curEnv(curEnv), _arr(arr)
392 {}
393 void do_field(fieldDescriptor* fd) {
394 ciField* field = new (_curEnv->arena()) ciField(fd);
395 _arr->append(field);
396 }
397 };
398
399 GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
400 if (_non_static_fields == NULL) {
401 VM_ENTRY_MARK;
402 ciEnv* curEnv = ciEnv::current();
403 instanceKlass* ik = get_instanceKlass();
404 int max_n_fields = ik->fields()->length()/instanceKlass::next_offset;
405
406 Arena* arena = curEnv->arena();
407 _non_static_fields =
408 new (arena) GrowableArray<ciField*>(arena, max_n_fields, 0, NULL);
409 NonStaticFieldFiller filler(curEnv, _non_static_fields);
410 ik->do_nonstatic_fields(&filler);
411 }
412 return _non_static_fields;
413 }
414
415 static int sort_field_by_offset(ciField** a, ciField** b) {
416 return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
417 // (no worries about 32-bit overflow...)
418 }
419
420 // ------------------------------------------------------------------
421 // ciInstanceKlass::compute_nonstatic_fields
422 int ciInstanceKlass::compute_nonstatic_fields() {
423 assert(is_loaded(), "must be loaded");
424
425 if (_nonstatic_fields != NULL)
426 return _nonstatic_fields->length();
427
428 if (!has_nonstatic_fields()) {
|