comparison src/share/vm/ci/ciInstanceKlass.cpp @ 44:52fed2ec0afb

6667620: (Escape Analysis) fix deoptimization for scalar replaced objects Summary: Deoptimization code for reallocation and relocking scalar replaced objects has to be fixed. Reviewed-by: rasbold, never
author kvn
date Tue, 11 Mar 2008 11:25:13 -0700
parents a61af66fc99e
children ba764ed4b6f2
comparison
equal deleted inserted replaced
43:d821d920b465 44:52fed2ec0afb
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...)