Mercurial > hg > truffle
comparison src/share/vm/oops/methodOop.cpp @ 1498:77261afdc5f2
6935118: UseCompressedOops modification in methodOopDesc::sort_methods() causes JCK timeout
Summary: Add comparison functions for compressed oops to use bubblesort.
Reviewed-by: never, coleenp
Contributed-by: volker.simonis@gmail.com
author | coleenp |
---|---|
date | Tue, 04 May 2010 15:12:08 -0400 |
parents | cef333a48af6 |
children | ef1a1d051971 |
comparison
equal
deleted
inserted
replaced
1497:96d554193f72 | 1498:77261afdc5f2 |
---|---|
1112 int i = method_compare(a, b); | 1112 int i = method_compare(a, b); |
1113 if (i != 0) return i; | 1113 if (i != 0) return i; |
1114 return ( a < b ? -1 : (a == b ? 0 : 1)); | 1114 return ( a < b ? -1 : (a == b ? 0 : 1)); |
1115 } | 1115 } |
1116 | 1116 |
1117 // We implement special compare versions for narrow oops to avoid | |
1118 // testing for UseCompressedOops on every comparison. | |
1119 static int method_compare_narrow(narrowOop* a, narrowOop* b) { | |
1120 methodOop m = (methodOop)oopDesc::load_decode_heap_oop(a); | |
1121 methodOop n = (methodOop)oopDesc::load_decode_heap_oop(b); | |
1122 return m->name()->fast_compare(n->name()); | |
1123 } | |
1124 | |
1125 static int method_compare_narrow_idempotent(narrowOop* a, narrowOop* b) { | |
1126 int i = method_compare_narrow(a, b); | |
1127 if (i != 0) return i; | |
1128 return ( a < b ? -1 : (a == b ? 0 : 1)); | |
1129 } | |
1130 | |
1117 typedef int (*compareFn)(const void*, const void*); | 1131 typedef int (*compareFn)(const void*, const void*); |
1118 } | 1132 } |
1119 | 1133 |
1120 | 1134 |
1121 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array | 1135 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array |
1164 } | 1178 } |
1165 } | 1179 } |
1166 | 1180 |
1167 // Use a simple bubble sort for small number of methods since | 1181 // Use a simple bubble sort for small number of methods since |
1168 // qsort requires a functional pointer call for each comparison. | 1182 // qsort requires a functional pointer call for each comparison. |
1169 if (UseCompressedOops || length < 8) { | 1183 if (length < 8) { |
1170 bool sorted = true; | 1184 bool sorted = true; |
1171 for (int i=length-1; i>0; i--) { | 1185 for (int i=length-1; i>0; i--) { |
1172 for (int j=0; j<i; j++) { | 1186 for (int j=0; j<i; j++) { |
1173 methodOop m1 = (methodOop)methods->obj_at(j); | 1187 methodOop m1 = (methodOop)methods->obj_at(j); |
1174 methodOop m2 = (methodOop)methods->obj_at(j+1); | 1188 methodOop m2 = (methodOop)methods->obj_at(j+1); |
1180 } | 1194 } |
1181 if (sorted) break; | 1195 if (sorted) break; |
1182 sorted = true; | 1196 sorted = true; |
1183 } | 1197 } |
1184 } else { | 1198 } else { |
1185 // XXX This doesn't work for UseCompressedOops because the compare fn | 1199 compareFn compare = |
1186 // will have to decode the methodOop anyway making it not much faster | 1200 (UseCompressedOops ? |
1187 // than above. | 1201 (compareFn) (idempotent ? method_compare_narrow_idempotent : method_compare_narrow): |
1188 compareFn compare = (compareFn) (idempotent ? method_compare_idempotent : method_compare); | 1202 (compareFn) (idempotent ? method_compare_idempotent : method_compare)); |
1189 qsort(methods->base(), length, heapOopSize, compare); | 1203 qsort(methods->base(), length, heapOopSize, compare); |
1190 } | 1204 } |
1191 | 1205 |
1192 // Sort annotations if necessary | 1206 // Sort annotations if necessary |
1193 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), ""); | 1207 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), ""); |