summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-08-30 16:29:23 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2014-08-30 16:29:23 -0700
commit0ac6761dfb5a9d867769de75a48edf1844e297cc (patch)
tree4fb99ed2f1f400e3792ecfbdc26deb2e301d8079 /src
parentf9caea823350640fb03195c73c301f08ce932bd0 (diff)
downloademacs-0ac6761dfb5a9d867769de75a48edf1844e297cc.tar.gz
* fns.c (sort_vector): Fix GC bug in previous change.
Diffstat (limited to 'src')
-rw-r--r--src/fns.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/fns.c b/src/fns.c
index 57c57884f4d..6cc5cef95df 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1992,17 +1992,18 @@ sort_vector (Lisp_Object vector, Lisp_Object predicate)
return;
ptrdiff_t halflen = len >> 1;
Lisp_Object *tmp;
+ Lisp_Object tmpvec = Qnil;
struct gcpro gcpro1, gcpro2, gcpro3;
- GCPRO3 (vector, predicate, predicate);
- USE_SAFE_ALLOCA;
- SAFE_ALLOCA_LISP (tmp, halflen);
- for (ptrdiff_t i = 0; i < halflen; i++)
- tmp[i] = make_number (0);
- gcpro3.var = tmp;
- gcpro3.nvars = halflen;
+ GCPRO3 (vector, predicate, tmpvec);
+ if (halflen < MAX_ALLOCA / word_size)
+ tmp = alloca (halflen * word_size);
+ else
+ {
+ tmpvec = Fmake_vector (make_number (halflen), make_number (0));
+ tmp = XVECTOR (tmpvec)->contents;
+ }
sort_vector_inplace (predicate, len, XVECTOR (vector)->contents, tmp);
UNGCPRO;
- SAFE_FREE ();
}
DEFUN ("sort", Fsort, Ssort, 2, 2, 0,