Mercurial > hg > truffle
comparison src/share/vm/oops/instanceKlass.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 | 75b0f3cb1943 |
comparison
equal
deleted
inserted
replaced
43:d821d920b465 | 44:52fed2ec0afb |
---|---|
789 if (fd.is_static()) { f(&fd, CHECK); } // Do NOT remove {}! (CHECK macro expands into several statements) | 789 if (fd.is_static()) { f(&fd, CHECK); } // Do NOT remove {}! (CHECK macro expands into several statements) |
790 } | 790 } |
791 } | 791 } |
792 | 792 |
793 | 793 |
794 static int compare_fields_by_offset(int* a, int* b) { | |
795 return a[0] - b[0]; | |
796 } | |
797 | |
794 void instanceKlass::do_nonstatic_fields(FieldClosure* cl) { | 798 void instanceKlass::do_nonstatic_fields(FieldClosure* cl) { |
795 fieldDescriptor fd; | |
796 instanceKlass* super = superklass(); | 799 instanceKlass* super = superklass(); |
797 if (super != NULL) { | 800 if (super != NULL) { |
798 super->do_nonstatic_fields(cl); | 801 super->do_nonstatic_fields(cl); |
799 } | 802 } |
803 fieldDescriptor fd; | |
800 int length = fields()->length(); | 804 int length = fields()->length(); |
805 // In DebugInfo nonstatic fields are sorted by offset. | |
806 int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1)); | |
807 int j = 0; | |
801 for (int i = 0; i < length; i += next_offset) { | 808 for (int i = 0; i < length; i += next_offset) { |
802 fd.initialize(as_klassOop(), i); | 809 fd.initialize(as_klassOop(), i); |
803 if (!(fd.is_static())) cl->do_field(&fd); | 810 if (!fd.is_static()) { |
804 } | 811 fields_sorted[j + 0] = fd.offset(); |
812 fields_sorted[j + 1] = i; | |
813 j += 2; | |
814 } | |
815 } | |
816 if (j > 0) { | |
817 length = j; | |
818 // _sort_Fn is defined in growableArray.hpp. | |
819 qsort(fields_sorted, length/2, 2*sizeof(int), (_sort_Fn)compare_fields_by_offset); | |
820 for (int i = 0; i < length; i += 2) { | |
821 fd.initialize(as_klassOop(), fields_sorted[i + 1]); | |
822 assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields"); | |
823 cl->do_field(&fd); | |
824 } | |
825 } | |
826 FREE_C_HEAP_ARRAY(int, fields_sorted); | |
805 } | 827 } |
806 | 828 |
807 | 829 |
808 void instanceKlass::array_klasses_do(void f(klassOop k)) { | 830 void instanceKlass::array_klasses_do(void f(klassOop k)) { |
809 if (array_klasses() != NULL) | 831 if (array_klasses() != NULL) |