diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2014-08-30 16:29:23 -0700 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-08-30 16:29:23 -0700 |
| commit | 0ac6761dfb5a9d867769de75a48edf1844e297cc (patch) | |
| tree | 4fb99ed2f1f400e3792ecfbdc26deb2e301d8079 /src | |
| parent | f9caea823350640fb03195c73c301f08ce932bd0 (diff) | |
| download | emacs-0ac6761dfb5a9d867769de75a48edf1844e297cc.tar.gz | |
* fns.c (sort_vector): Fix GC bug in previous change.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 17 |
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, |
