diff options
| author | Paul Eggert | 2014-08-30 16:29:23 -0700 |
|---|---|---|
| committer | Paul Eggert | 2014-08-30 16:29:23 -0700 |
| commit | 0ac6761dfb5a9d867769de75a48edf1844e297cc (patch) | |
| tree | 4fb99ed2f1f400e3792ecfbdc26deb2e301d8079 /src | |
| parent | f9caea823350640fb03195c73c301f08ce932bd0 (diff) | |
| download | emacs-0ac6761dfb5a9d867769de75a48edf1844e297cc.tar.gz emacs-0ac6761dfb5a9d867769de75a48edf1844e297cc.zip | |
* 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
| @@ -1992,17 +1992,18 @@ sort_vector (Lisp_Object vector, Lisp_Object predicate) | |||
| 1992 | return; | 1992 | return; |
| 1993 | ptrdiff_t halflen = len >> 1; | 1993 | ptrdiff_t halflen = len >> 1; |
| 1994 | Lisp_Object *tmp; | 1994 | Lisp_Object *tmp; |
| 1995 | Lisp_Object tmpvec = Qnil; | ||
| 1995 | struct gcpro gcpro1, gcpro2, gcpro3; | 1996 | struct gcpro gcpro1, gcpro2, gcpro3; |
| 1996 | GCPRO3 (vector, predicate, predicate); | 1997 | GCPRO3 (vector, predicate, tmpvec); |
| 1997 | USE_SAFE_ALLOCA; | 1998 | if (halflen < MAX_ALLOCA / word_size) |
| 1998 | SAFE_ALLOCA_LISP (tmp, halflen); | 1999 | tmp = alloca (halflen * word_size); |
| 1999 | for (ptrdiff_t i = 0; i < halflen; i++) | 2000 | else |
| 2000 | tmp[i] = make_number (0); | 2001 | { |
| 2001 | gcpro3.var = tmp; | 2002 | tmpvec = Fmake_vector (make_number (halflen), make_number (0)); |
| 2002 | gcpro3.nvars = halflen; | 2003 | tmp = XVECTOR (tmpvec)->contents; |
| 2004 | } | ||
| 2003 | sort_vector_inplace (predicate, len, XVECTOR (vector)->contents, tmp); | 2005 | sort_vector_inplace (predicate, len, XVECTOR (vector)->contents, tmp); |
| 2004 | UNGCPRO; | 2006 | UNGCPRO; |
| 2005 | SAFE_FREE (); | ||
| 2006 | } | 2007 | } |
| 2007 | 2008 | ||
| 2008 | DEFUN ("sort", Fsort, Ssort, 2, 2, 0, | 2009 | DEFUN ("sort", Fsort, Ssort, 2, 2, 0, |