diff options
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, |