зеркало из https://github.com/mozilla/gecko-dev.git
Fix sorting bug reported by Michael Kaply <mkaply@us.ibm.com>. There was a bad assumption that qsort would produce the exact same ordering on two arrays with elements of different size even when some string keys compare the same. The fix is to use the address of the string keys as a fallback in the compare function. This works right because the two arrays have diffrent elements, but they contain pointers to shared strings. r=mccabe
This commit is contained in:
Родитель
410da80665
Коммит
b70921c2ba
|
@ -46,6 +46,7 @@ static int compare_IDE_with_zero(const void *ap);
|
|||
static int compare_IDEs_by_name(const void *ap, const void *bp);
|
||||
static int compare_IDEs_by_name_space(const void *ap, const void *bp);
|
||||
static int compare_strings(const void *ap, const void *bp);
|
||||
static int compare_pointers(const void *ap, const void *bp);
|
||||
static int compare_fixElements_by_IID(const void *ap, const void *bp);
|
||||
static int compare_fixElements_by_name(const void *ap, const void *bp);
|
||||
static int compare_IIDs(const void *ap, const void *bp);
|
||||
|
@ -262,8 +263,10 @@ main(int argc, char **argv)
|
|||
|
||||
/* Check for name_space::name collision.
|
||||
*/
|
||||
if (compare_IDEs_by_name(&IDE_array[i-1], &IDE_array[i]) == 0 &&
|
||||
compare_IDEs_by_name_space(&IDE_array[i-1], &IDE_array[i]) == 0) {
|
||||
if (compare_strings(IDE_array[i-1].name,
|
||||
IDE_array[i].name) == 0 &&
|
||||
compare_strings(IDE_array[i-1].name_space,
|
||||
IDE_array[i].name_space) == 0) {
|
||||
|
||||
/* If one of the interfaces is unresolved, delete that one
|
||||
* preferentailly.
|
||||
|
@ -526,8 +529,11 @@ compare_IDEs_by_name(const void *ap,
|
|||
const void *bp)
|
||||
{
|
||||
const XPTInterfaceDirectoryEntry *ide1 = ap, *ide2 = bp;
|
||||
int answer = compare_strings(ide1->name, ide2->name);
|
||||
if(!answer)
|
||||
answer = compare_pointers(ide1->name, ide2->name);
|
||||
|
||||
return compare_strings(ide1->name, ide2->name);
|
||||
return answer;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -554,13 +560,30 @@ compare_strings(const void *ap, const void *bp)
|
|||
return strcmp(string1, string2);
|
||||
}
|
||||
|
||||
static int
|
||||
compare_pointers(const void *ap, const void *bp)
|
||||
{
|
||||
if (ap == bp) {
|
||||
#ifdef DEBUG_jband
|
||||
perror("name addresses were equal!");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
if (ap > bp)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
compare_fixElements_by_name(const void *ap,
|
||||
const void *bp)
|
||||
{
|
||||
const fixElement *fix1 = ap, *fix2 = bp;
|
||||
int answer= compare_strings(fix1->name, fix2->name);
|
||||
if(!answer)
|
||||
answer = compare_pointers(fix1->name, fix2->name);
|
||||
|
||||
return compare_strings(fix1->name, fix2->name);
|
||||
return answer;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Загрузка…
Ссылка в новой задаче