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)