Mercurial > hg > graal-jvmci-8
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...) |