From cae070000107848cd082496e14cf5851cc1f2c25 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 9 Mar 2012 11:46:25 -0500 Subject: * src/buffer.c (compare_overlays): Avoid qsort's instability. Fixes: debbugs:6830 --- src/buffer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/buffer.c') diff --git a/src/buffer.c b/src/buffer.c index 1577254d92a..efb9a80f35d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2864,7 +2864,11 @@ compare_overlays (const void *v1, const void *v2) return s1->beg < s2->beg ? -1 : 1; if (s1->end != s2->end) return s2->end < s1->end ? -1 : 1; - return 0; + /* Avoid the non-determinism of qsort by choosing an arbitrary ordering + between "equal" overlays. The result can still change between + invocations of Emacs, but it won't change in the middle of + `find_field' (bug#6830). */ + return XHASH (s1->overlay) < XHASH (s2->overlay) ? -1 : 1; } /* Sort an array of overlays by priority. The array is modified in place. -- cgit v1.2.1 From 9af5ed875659d596fcd5c84b7456ae4750cb3011 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 12 Mar 2012 01:27:25 -0700 Subject: * buffer.c (compare_overlays): Don't assume args differ (Bug#6830). --- src/buffer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/buffer.c') diff --git a/src/buffer.c b/src/buffer.c index efb9a80f35d..1fea19b0d65 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2868,7 +2868,9 @@ compare_overlays (const void *v1, const void *v2) between "equal" overlays. The result can still change between invocations of Emacs, but it won't change in the middle of `find_field' (bug#6830). */ - return XHASH (s1->overlay) < XHASH (s2->overlay) ? -1 : 1; + if (XHASH (s1->overlay) != XHASH (s2->overlay)) + return XHASH (s1->overlay) < XHASH (s2->overlay) ? -1 : 1; + return 0; } /* Sort an array of overlays by priority. The array is modified in place. -- cgit v1.2.1