- return vector;
- /* Record original index of each element to make qsort stable. */
- for (i = 0; i < len; i++)
- v[i] = make_save_int_obj (i, v[i]);
-
- /* Setup predicate and sort. */
-#ifdef HAVE_QSORT_R
- qsort_r (v, len, word_size, sort_vector_compare, (void *) &predicate);
-#else
- sort_vector_predicate = predicate;
- qsort (v, len, word_size, sort_vector_compare);
-#endif /* HAVE_QSORT_R */
-
- /* Discard indexes and restore original elements. */
- for (i = 0; i < len; i++)
- {
- Lisp_Object save = v[i];
- /* Use explicit free to offload GC. */
- v[i] = XSAVE_OBJECT (save, 1);
- free_misc (save);
- }
- return vector;
+ return;
+ ptrdiff_t halflen = len >> 1;
+ Lisp_Object *tmp;
+ struct gcpro gcpro1, gcpro2;
+ GCPRO2 (vector, predicate);
+ USE_SAFE_ALLOCA;
+ SAFE_ALLOCA_LISP (tmp, halflen);
+ for (ptrdiff_t i = 0; i < halflen; i++)
+ tmp[i] = make_number (0);
+ sort_vector_inplace (predicate, len, XVECTOR (vector)->contents, tmp);
+ SAFE_FREE ();
+ UNGCPRO;