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");
|