Fixed VG_(ssort)(), which was broken for the size != {1,2,4} general case.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1933 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c
index 5aa4c09..92addf4 100644
--- a/coregrind/vg_mylibc.c
+++ b/coregrind/vg_mylibc.c
@@ -1550,18 +1550,15 @@
#define SORT \
for ( ; hp >= 0; hp--) { \
h = incs[hp]; \
- i = lo + h; \
- while (1) { \
- if (i > hi) break; \
+ for (i = lo + h; i <= hi; i++) { \
ASSIGN(v,0, a,i); \
j = i; \
- while (COMPAR(a,(j-h), v,0) > 0) { \
+ while (COMPAR(a,(j-h), v,0) > 0) { \
ASSIGN(a,j, a,(j-h)); \
j = j - h; \
if (j <= (lo + h - 1)) break; \
} \
ASSIGN(a,j, v,0); \
- i++; \
} \
}
@@ -1596,16 +1593,14 @@
// General case
} else {
- void* a = (void*)base;
- Char vc[size]; // will be at least 'size' bytes
- void* v = (void*)vc;
+ char* a = base;
+ char v[size]; // will be at least 'size' bytes
#define ASSIGN(dst, dsti, src, srci) \
- VG_(memcpy)( (void*)((dst) + size*(dsti)), \
- (void*)((src) + size*(srci)), (size) );
+ VG_(memcpy)( &dst[size*(dsti)], &src[size*(srci)], size );
#define COMPAR(dst, dsti, src, srci) \
- compar( (void*)((dst) + size*(dsti)), (void*)((src) + size*(srci)) )
+ compar( &dst[size*(dsti)], &src[size*(srci)] )
SORT;