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...) |