This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to SelfLoader 1.13_03
[perl5.git] / pp_sort.c
1 /*    pp_sort.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  *   ...they shuffled back towards the rear of the line. 'No, not at the
13  *   rear!'  the slave-driver shouted. 'Three files up. And stay there...
14  */
15
16 /* This file contains pp ("push/pop") functions that
17  * execute the opcodes that make up a perl program. A typical pp function
18  * expects to find its arguments on the stack, and usually pushes its
19  * results onto the stack, hence the 'pp' terminology. Each OP structure
20  * contains a pointer to the relevant pp_foo() function.
21  *
22  * This particular file just contains pp_sort(), which is complex
23  * enough to merit its own file! See the other pp*.c files for the rest of
24  * the pp_ functions.
25  */
26
27 #include "EXTERN.h"
28 #define PERL_IN_PP_SORT_C
29 #include "perl.h"
30
31 #if defined(UNDER_CE)
32 /* looks like 'small' is reserved word for WINCE (or somesuch)*/
33 #define small xsmall
34 #endif
35
36 #define sv_cmp_static Perl_sv_cmp
37 #define sv_cmp_locale_static Perl_sv_cmp_locale
38
39 #ifndef SMALLSORT
40 #define SMALLSORT (200)
41 #endif
42
43 /* Flags for qsortsv and mergesortsv */
44 #define SORTf_DESC   1
45 #define SORTf_STABLE 2
46 #define SORTf_QSORT  4
47
48 /*
49  * The mergesort implementation is by Peter M. Mcilroy <pmcilroy@lucent.com>.
50  *
51  * The original code was written in conjunction with BSD Computer Software
52  * Research Group at University of California, Berkeley.
53  *
54  * See also: "Optimistic Merge Sort" (SODA '92)
55  *
56  * The integration to Perl is by John P. Linderman <jpl@research.att.com>.
57  *
58  * The code can be distributed under the same terms as Perl itself.
59  *
60  */
61
62
63 typedef char * aptr;            /* pointer for arithmetic on sizes */
64 typedef SV * gptr;              /* pointers in our lists */
65
66 /* Binary merge internal sort, with a few special mods
67 ** for the special perl environment it now finds itself in.
68 **
69 ** Things that were once options have been hotwired
70 ** to values suitable for this use.  In particular, we'll always
71 ** initialize looking for natural runs, we'll always produce stable
72 ** output, and we'll always do Peter McIlroy's binary merge.
73 */
74
75 /* Pointer types for arithmetic and storage and convenience casts */
76
77 #define APTR(P) ((aptr)(P))
78 #define GPTP(P) ((gptr *)(P))
79 #define GPPP(P) ((gptr **)(P))
80
81
82 /* byte offset from pointer P to (larger) pointer Q */
83 #define BYTEOFF(P, Q) (APTR(Q) - APTR(P))
84
85 #define PSIZE sizeof(gptr)
86
87 /* If PSIZE is power of 2, make PSHIFT that power, if that helps */
88
89 #ifdef  PSHIFT
90 #define PNELEM(P, Q)    (BYTEOFF(P,Q) >> (PSHIFT))
91 #define PNBYTE(N)       ((N) << (PSHIFT))
92 #define PINDEX(P, N)    (GPTP(APTR(P) + PNBYTE(N)))
93 #else
94 /* Leave optimization to compiler */
95 #define PNELEM(P, Q)    (GPTP(Q) - GPTP(P))
96 #define PNBYTE(N)       ((N) * (PSIZE))
97 #define PINDEX(P, N)    (GPTP(P) + (N))
98 #endif
99
100 /* Pointer into other corresponding to pointer into this */
101 #define POTHER(P, THIS, OTHER) GPTP(APTR(OTHER) + BYTEOFF(THIS,P))
102
103 #define FROMTOUPTO(src, dst, lim) do *dst++ = *src++; while(src<lim)
104
105
106 /* Runs are identified by a pointer in the auxilliary list.
107 ** The pointer is at the start of the list,
108 ** and it points to the start of the next list.
109 ** NEXT is used as an lvalue, too.
110 */
111
112 #define NEXT(P)         (*GPPP(P))
113
114
115 /* PTHRESH is the minimum number of pairs with the same sense to justify
116 ** checking for a run and extending it.  Note that PTHRESH counts PAIRS,
117 ** not just elements, so PTHRESH == 8 means a run of 16.
118 */
119
120 #define PTHRESH (8)
121
122 /* RTHRESH is the number of elements in a run that must compare low
123 ** to the low element from the opposing run before we justify
124 ** doing a binary rampup instead of single stepping.
125 ** In random input, N in a row low should only happen with
126 ** probability 2^(1-N), so we can risk that we are dealing
127 ** with orderly input without paying much when we aren't.
128 */
129
130 #define RTHRESH (6)
131
132
133 /*
134 ** Overview of algorithm and variables.
135 ** The array of elements at list1 will be organized into runs of length 2,
136 ** or runs of length >= 2 * PTHRESH.  We only try to form long runs when
137 ** PTHRESH adjacent pairs compare in the same way, suggesting overall order.
138 **
139 ** Unless otherwise specified, pair pointers address the first of two elements.
140 **
141 ** b and b+1 are a pair that compare with sense "sense".
142 ** b is the "bottom" of adjacent pairs that might form a longer run.
143 **
144 ** p2 parallels b in the list2 array, where runs are defined by
145 ** a pointer chain.
146 **
147 ** t represents the "top" of the adjacent pairs that might extend
148 ** the run beginning at b.  Usually, t addresses a pair
149 ** that compares with opposite sense from (b,b+1).
150 ** However, it may also address a singleton element at the end of list1,
151 ** or it may be equal to "last", the first element beyond list1.
152 **
153 ** r addresses the Nth pair following b.  If this would be beyond t,
154 ** we back it off to t.  Only when r is less than t do we consider the
155 ** run long enough to consider checking.
156 **
157 ** q addresses a pair such that the pairs at b through q already form a run.
158 ** Often, q will equal b, indicating we only are sure of the pair itself.
159 ** However, a search on the previous cycle may have revealed a longer run,
160 ** so q may be greater than b.
161 **
162 ** p is used to work back from a candidate r, trying to reach q,
163 ** which would mean b through r would be a run.  If we discover such a run,
164 ** we start q at r and try to push it further towards t.
165 ** If b through r is NOT a run, we detect the wrong order at (p-1,p).
166 ** In any event, after the check (if any), we have two main cases.
167 **
168 ** 1) Short run.  b <= q < p <= r <= t.
169 **      b through q is a run (perhaps trivial)
170 **      q through p are uninteresting pairs
171 **      p through r is a run
172 **
173 ** 2) Long run.  b < r <= q < t.
174 **      b through q is a run (of length >= 2 * PTHRESH)
175 **
176 ** Note that degenerate cases are not only possible, but likely.
177 ** For example, if the pair following b compares with opposite sense,
178 ** then b == q < p == r == t.
179 */
180
181
182 static IV
183 dynprep(pTHX_ gptr *list1, gptr *list2, size_t nmemb, const SVCOMPARE_t cmp)
184 {
185     I32 sense;
186     register gptr *b, *p, *q, *t, *p2;
187     register gptr *last, *r;
188     IV runs = 0;
189
190     b = list1;
191     last = PINDEX(b, nmemb);
192     sense = (cmp(aTHX_ *b, *(b+1)) > 0);
193     for (p2 = list2; b < last; ) {
194         /* We just started, or just reversed sense.
195         ** Set t at end of pairs with the prevailing sense.
196         */
197         for (p = b+2, t = p; ++p < last; t = ++p) {
198             if ((cmp(aTHX_ *t, *p) > 0) != sense) break;
199         }
200         q = b;
201         /* Having laid out the playing field, look for long runs */
202         do {
203             p = r = b + (2 * PTHRESH);
204             if (r >= t) p = r = t;      /* too short to care about */
205             else {
206                 while (((cmp(aTHX_ *(p-1), *p) > 0) == sense) &&
207                        ((p -= 2) > q));
208                 if (p <= q) {
209                     /* b through r is a (long) run.
210                     ** Extend it as far as possible.
211                     */
212                     p = q = r;
213                     while (((p += 2) < t) &&
214                            ((cmp(aTHX_ *(p-1), *p) > 0) == sense)) q = p;
215                     r = p = q + 2;      /* no simple pairs, no after-run */
216                 }
217             }
218             if (q > b) {                /* run of greater than 2 at b */
219                 gptr *savep = p;
220
221                 p = q += 2;
222                 /* pick up singleton, if possible */
223                 if ((p == t) &&
224                     ((t + 1) == last) &&
225                     ((cmp(aTHX_ *(p-1), *p) > 0) == sense))
226                     savep = r = p = q = last;
227                 p2 = NEXT(p2) = p2 + (p - b); ++runs;
228                 if (sense)
229                     while (b < --p) {
230                         const gptr c = *b;
231                         *b++ = *p;
232                         *p = c;
233                     }
234                 p = savep;
235             }
236             while (q < p) {             /* simple pairs */
237                 p2 = NEXT(p2) = p2 + 2; ++runs;
238                 if (sense) {
239                     const gptr c = *q++;
240                     *(q-1) = *q;
241                     *q++ = c;
242                 } else q += 2;
243             }
244             if (((b = p) == t) && ((t+1) == last)) {
245                 NEXT(p2) = p2 + 1; ++runs;
246                 b++;
247             }
248             q = r;
249         } while (b < t);
250         sense = !sense;
251     }
252     return runs;
253 }
254
255
256 /* The original merge sort, in use since 5.7, was as fast as, or faster than,
257  * qsort on many platforms, but slower than qsort, conspicuously so,
258  * on others.  The most likely explanation was platform-specific
259  * differences in cache sizes and relative speeds.
260  *
261  * The quicksort divide-and-conquer algorithm guarantees that, as the
262  * problem is subdivided into smaller and smaller parts, the parts
263  * fit into smaller (and faster) caches.  So it doesn't matter how
264  * many levels of cache exist, quicksort will "find" them, and,
265  * as long as smaller is faster, take advantage of them.
266  *
267  * By contrast, consider how the original mergesort algorithm worked.
268  * Suppose we have five runs (each typically of length 2 after dynprep).
269  * 
270  * pass               base                        aux
271  *  0              1 2 3 4 5
272  *  1                                           12 34 5
273  *  2                1234 5
274  *  3                                            12345
275  *  4                 12345
276  *
277  * Adjacent pairs are merged in "grand sweeps" through the input.
278  * This means, on pass 1, the records in runs 1 and 2 aren't revisited until
279  * runs 3 and 4 are merged and the runs from run 5 have been copied.
280  * The only cache that matters is one large enough to hold *all* the input.
281  * On some platforms, this may be many times slower than smaller caches.
282  *
283  * The following pseudo-code uses the same basic merge algorithm,
284  * but in a divide-and-conquer way.
285  *
286  * # merge $runs runs at offset $offset of list $list1 into $list2.
287  * # all unmerged runs ($runs == 1) originate in list $base.
288  * sub mgsort2 {
289  *     my ($offset, $runs, $base, $list1, $list2) = @_;
290  *
291  *     if ($runs == 1) {
292  *         if ($list1 is $base) copy run to $list2
293  *         return offset of end of list (or copy)
294  *     } else {
295  *         $off2 = mgsort2($offset, $runs-($runs/2), $base, $list2, $list1)
296  *         mgsort2($off2, $runs/2, $base, $list2, $list1)
297  *         merge the adjacent runs at $offset of $list1 into $list2
298  *         return the offset of the end of the merged runs
299  *     }
300  * }
301  * mgsort2(0, $runs, $base, $aux, $base);
302  *
303  * For our 5 runs, the tree of calls looks like 
304  *
305  *           5
306  *      3        2
307  *   2     1   1   1
308  * 1   1
309  *
310  * 1   2   3   4   5
311  *
312  * and the corresponding activity looks like
313  *
314  * copy runs 1 and 2 from base to aux
315  * merge runs 1 and 2 from aux to base
316  * (run 3 is where it belongs, no copy needed)
317  * merge runs 12 and 3 from base to aux
318  * (runs 4 and 5 are where they belong, no copy needed)
319  * merge runs 4 and 5 from base to aux
320  * merge runs 123 and 45 from aux to base
321  *
322  * Note that we merge runs 1 and 2 immediately after copying them,
323  * while they are still likely to be in fast cache.  Similarly,
324  * run 3 is merged with run 12 while it still may be lingering in cache.
325  * This implementation should therefore enjoy much of the cache-friendly
326  * behavior that quicksort does.  In addition, it does less copying
327  * than the original mergesort implementation (only runs 1 and 2 are copied)
328  * and the "balancing" of merges is better (merged runs comprise more nearly
329  * equal numbers of original runs).
330  *
331  * The actual cache-friendly implementation will use a pseudo-stack
332  * to avoid recursion, and will unroll processing of runs of length 2,
333  * but it is otherwise similar to the recursive implementation.
334  */
335
336 typedef struct {
337     IV  offset;         /* offset of 1st of 2 runs at this level */
338     IV  runs;           /* how many runs must be combined into 1 */
339 } off_runs;             /* pseudo-stack element */
340
341
342 static I32
343 cmp_desc(pTHX_ gptr a, gptr b)
344 {
345     dVAR;
346     return -PL_sort_RealCmp(aTHX_ a, b);
347 }
348
349 STATIC void
350 S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
351 {
352     dVAR;
353     IV i, run, offset;
354     I32 sense, level;
355     register gptr *f1, *f2, *t, *b, *p;
356     int iwhich;
357     gptr *aux;
358     gptr *p1;
359     gptr small[SMALLSORT];
360     gptr *which[3];
361     off_runs stack[60], *stackp;
362     SVCOMPARE_t savecmp = NULL;
363
364     if (nmemb <= 1) return;                     /* sorted trivially */
365
366     if ((flags & SORTf_DESC) != 0) {
367         savecmp = PL_sort_RealCmp;      /* Save current comparison routine, if any */
368         PL_sort_RealCmp = cmp;  /* Put comparison routine where cmp_desc can find it */
369         cmp = cmp_desc;
370     }
371
372     if (nmemb <= SMALLSORT) aux = small;        /* use stack for aux array */
373     else { Newx(aux,nmemb,gptr); }              /* allocate auxilliary array */
374     level = 0;
375     stackp = stack;
376     stackp->runs = dynprep(aTHX_ base, aux, nmemb, cmp);
377     stackp->offset = offset = 0;
378     which[0] = which[2] = base;
379     which[1] = aux;
380     for (;;) {
381         /* On levels where both runs have be constructed (stackp->runs == 0),
382          * merge them, and note the offset of their end, in case the offset
383          * is needed at the next level up.  Hop up a level, and,
384          * as long as stackp->runs is 0, keep merging.
385          */
386         IV runs = stackp->runs;
387         if (runs == 0) {
388             gptr *list1, *list2;
389             iwhich = level & 1;
390             list1 = which[iwhich];              /* area where runs are now */
391             list2 = which[++iwhich];            /* area for merged runs */
392             do {
393                 register gptr *l1, *l2, *tp2;
394                 offset = stackp->offset;
395                 f1 = p1 = list1 + offset;               /* start of first run */
396                 p = tp2 = list2 + offset;       /* where merged run will go */
397                 t = NEXT(p);                    /* where first run ends */
398                 f2 = l1 = POTHER(t, list2, list1); /* ... on the other side */
399                 t = NEXT(t);                    /* where second runs ends */
400                 l2 = POTHER(t, list2, list1);   /* ... on the other side */
401                 offset = PNELEM(list2, t);
402                 while (f1 < l1 && f2 < l2) {
403                     /* If head 1 is larger than head 2, find ALL the elements
404                     ** in list 2 strictly less than head1, write them all,
405                     ** then head 1.  Then compare the new heads, and repeat,
406                     ** until one or both lists are exhausted.
407                     **
408                     ** In all comparisons (after establishing
409                     ** which head to merge) the item to merge
410                     ** (at pointer q) is the first operand of
411                     ** the comparison.  When we want to know
412                     ** if "q is strictly less than the other",
413                     ** we can't just do
414                     **    cmp(q, other) < 0
415                     ** because stability demands that we treat equality
416                     ** as high when q comes from l2, and as low when
417                     ** q was from l1.  So we ask the question by doing
418                     **    cmp(q, other) <= sense
419                     ** and make sense == 0 when equality should look low,
420                     ** and -1 when equality should look high.
421                     */
422
423                     register gptr *q;
424                     if (cmp(aTHX_ *f1, *f2) <= 0) {
425                         q = f2; b = f1; t = l1;
426                         sense = -1;
427                     } else {
428                         q = f1; b = f2; t = l2;
429                         sense = 0;
430                     }
431
432
433                     /* ramp up
434                     **
435                     ** Leave t at something strictly
436                     ** greater than q (or at the end of the list),
437                     ** and b at something strictly less than q.
438                     */
439                     for (i = 1, run = 0 ;;) {
440                         if ((p = PINDEX(b, i)) >= t) {
441                             /* off the end */
442                             if (((p = PINDEX(t, -1)) > b) &&
443                                 (cmp(aTHX_ *q, *p) <= sense))
444                                  t = p;
445                             else b = p;
446                             break;
447                         } else if (cmp(aTHX_ *q, *p) <= sense) {
448                             t = p;
449                             break;
450                         } else b = p;
451                         if (++run >= RTHRESH) i += i;
452                     }
453
454
455                     /* q is known to follow b and must be inserted before t.
456                     ** Increment b, so the range of possibilities is [b,t).
457                     ** Round binary split down, to favor early appearance.
458                     ** Adjust b and t until q belongs just before t.
459                     */
460
461                     b++;
462                     while (b < t) {
463                         p = PINDEX(b, (PNELEM(b, t) - 1) / 2);
464                         if (cmp(aTHX_ *q, *p) <= sense) {
465                             t = p;
466                         } else b = p + 1;
467                     }
468
469
470                     /* Copy all the strictly low elements */
471
472                     if (q == f1) {
473                         FROMTOUPTO(f2, tp2, t);
474                         *tp2++ = *f1++;
475                     } else {
476                         FROMTOUPTO(f1, tp2, t);
477                         *tp2++ = *f2++;
478                     }
479                 }
480
481
482                 /* Run out remaining list */
483                 if (f1 == l1) {
484                        if (f2 < l2) FROMTOUPTO(f2, tp2, l2);
485                 } else              FROMTOUPTO(f1, tp2, l1);
486                 p1 = NEXT(p1) = POTHER(tp2, list2, list1);
487
488                 if (--level == 0) goto done;
489                 --stackp;
490                 t = list1; list1 = list2; list2 = t;    /* swap lists */
491             } while ((runs = stackp->runs) == 0);
492         }
493
494
495         stackp->runs = 0;               /* current run will finish level */
496         /* While there are more than 2 runs remaining,
497          * turn them into exactly 2 runs (at the "other" level),
498          * each made up of approximately half the runs.
499          * Stack the second half for later processing,
500          * and set about producing the first half now.
501          */
502         while (runs > 2) {
503             ++level;
504             ++stackp;
505             stackp->offset = offset;
506             runs -= stackp->runs = runs / 2;
507         }
508         /* We must construct a single run from 1 or 2 runs.
509          * All the original runs are in which[0] == base.
510          * The run we construct must end up in which[level&1].
511          */
512         iwhich = level & 1;
513         if (runs == 1) {
514             /* Constructing a single run from a single run.
515              * If it's where it belongs already, there's nothing to do.
516              * Otherwise, copy it to where it belongs.
517              * A run of 1 is either a singleton at level 0,
518              * or the second half of a split 3.  In neither event
519              * is it necessary to set offset.  It will be set by the merge
520              * that immediately follows.
521              */
522             if (iwhich) {       /* Belongs in aux, currently in base */
523                 f1 = b = PINDEX(base, offset);  /* where list starts */
524                 f2 = PINDEX(aux, offset);       /* where list goes */
525                 t = NEXT(f2);                   /* where list will end */
526                 offset = PNELEM(aux, t);        /* offset thereof */
527                 t = PINDEX(base, offset);       /* where it currently ends */
528                 FROMTOUPTO(f1, f2, t);          /* copy */
529                 NEXT(b) = t;                    /* set up parallel pointer */
530             } else if (level == 0) goto done;   /* single run at level 0 */
531         } else {
532             /* Constructing a single run from two runs.
533              * The merge code at the top will do that.
534              * We need only make sure the two runs are in the "other" array,
535              * so they'll end up in the correct array after the merge.
536              */
537             ++level;
538             ++stackp;
539             stackp->offset = offset;
540             stackp->runs = 0;   /* take care of both runs, trigger merge */
541             if (!iwhich) {      /* Merged runs belong in aux, copy 1st */
542                 f1 = b = PINDEX(base, offset);  /* where first run starts */
543                 f2 = PINDEX(aux, offset);       /* where it will be copied */
544                 t = NEXT(f2);                   /* where first run will end */
545                 offset = PNELEM(aux, t);        /* offset thereof */
546                 p = PINDEX(base, offset);       /* end of first run */
547                 t = NEXT(t);                    /* where second run will end */
548                 t = PINDEX(base, PNELEM(aux, t)); /* where it now ends */
549                 FROMTOUPTO(f1, f2, t);          /* copy both runs */
550                 NEXT(b) = p;                    /* paralled pointer for 1st */
551                 NEXT(p) = t;                    /* ... and for second */
552             }
553         }
554     }
555 done:
556     if (aux != small) Safefree(aux);    /* free iff allocated */
557     if (flags) {
558          PL_sort_RealCmp = savecmp;     /* Restore current comparison routine, if any */
559     }
560     return;
561 }
562
563 /*
564  * The quicksort implementation was derived from source code contributed
565  * by Tom Horsley.
566  *
567  * NOTE: this code was derived from Tom Horsley's qsort replacement
568  * and should not be confused with the original code.
569  */
570
571 /* Copyright (C) Tom Horsley, 1997. All rights reserved.
572
573    Permission granted to distribute under the same terms as perl which are
574    (briefly):
575
576     This program is free software; you can redistribute it and/or modify
577     it under the terms of either:
578
579         a) the GNU General Public License as published by the Free
580         Software Foundation; either version 1, or (at your option) any
581         later version, or
582
583         b) the "Artistic License" which comes with this Kit.
584
585    Details on the perl license can be found in the perl source code which
586    may be located via the www.perl.com web page.
587
588    This is the most wonderfulest possible qsort I can come up with (and
589    still be mostly portable) My (limited) tests indicate it consistently
590    does about 20% fewer calls to compare than does the qsort in the Visual
591    C++ library, other vendors may vary.
592
593    Some of the ideas in here can be found in "Algorithms" by Sedgewick,
594    others I invented myself (or more likely re-invented since they seemed
595    pretty obvious once I watched the algorithm operate for a while).
596
597    Most of this code was written while watching the Marlins sweep the Giants
598    in the 1997 National League Playoffs - no Braves fans allowed to use this
599    code (just kidding :-).
600
601    I realize that if I wanted to be true to the perl tradition, the only
602    comment in this file would be something like:
603
604    ...they shuffled back towards the rear of the line. 'No, not at the
605    rear!'  the slave-driver shouted. 'Three files up. And stay there...
606
607    However, I really needed to violate that tradition just so I could keep
608    track of what happens myself, not to mention some poor fool trying to
609    understand this years from now :-).
610 */
611
612 /* ********************************************************** Configuration */
613
614 #ifndef QSORT_ORDER_GUESS
615 #define QSORT_ORDER_GUESS 2     /* Select doubling version of the netBSD trick */
616 #endif
617
618 /* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
619    future processing - a good max upper bound is log base 2 of memory size
620    (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
621    safely be smaller than that since the program is taking up some space and
622    most operating systems only let you grab some subset of contiguous
623    memory (not to mention that you are normally sorting data larger than
624    1 byte element size :-).
625 */
626 #ifndef QSORT_MAX_STACK
627 #define QSORT_MAX_STACK 32
628 #endif
629
630 /* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
631    Anything bigger and we use qsort. If you make this too small, the qsort
632    will probably break (or become less efficient), because it doesn't expect
633    the middle element of a partition to be the same as the right or left -
634    you have been warned).
635 */
636 #ifndef QSORT_BREAK_EVEN
637 #define QSORT_BREAK_EVEN 6
638 #endif
639
640 /* QSORT_PLAY_SAFE is the size of the largest partition we're willing
641    to go quadratic on.  We innoculate larger partitions against
642    quadratic behavior by shuffling them before sorting.  This is not
643    an absolute guarantee of non-quadratic behavior, but it would take
644    staggeringly bad luck to pick extreme elements as the pivot
645    from randomized data.
646 */
647 #ifndef QSORT_PLAY_SAFE
648 #define QSORT_PLAY_SAFE 255
649 #endif
650
651 /* ************************************************************* Data Types */
652
653 /* hold left and right index values of a partition waiting to be sorted (the
654    partition includes both left and right - right is NOT one past the end or
655    anything like that).
656 */
657 struct partition_stack_entry {
658    int left;
659    int right;
660 #ifdef QSORT_ORDER_GUESS
661    int qsort_break_even;
662 #endif
663 };
664
665 /* ******************************************************* Shorthand Macros */
666
667 /* Note that these macros will be used from inside the qsort function where
668    we happen to know that the variable 'elt_size' contains the size of an
669    array element and the variable 'temp' points to enough space to hold a
670    temp element and the variable 'array' points to the array being sorted
671    and 'compare' is the pointer to the compare routine.
672
673    Also note that there are very many highly architecture specific ways
674    these might be sped up, but this is simply the most generally portable
675    code I could think of.
676 */
677
678 /* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
679 */
680 #define qsort_cmp(elt1, elt2) \
681    ((*compare)(aTHX_ array[elt1], array[elt2]))
682
683 #ifdef QSORT_ORDER_GUESS
684 #define QSORT_NOTICE_SWAP swapped++;
685 #else
686 #define QSORT_NOTICE_SWAP
687 #endif
688
689 /* swaps contents of array elements elt1, elt2.
690 */
691 #define qsort_swap(elt1, elt2) \
692    STMT_START { \
693       QSORT_NOTICE_SWAP \
694       temp = array[elt1]; \
695       array[elt1] = array[elt2]; \
696       array[elt2] = temp; \
697    } STMT_END
698
699 /* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
700    elt3 and elt3 gets elt1.
701 */
702 #define qsort_rotate(elt1, elt2, elt3) \
703    STMT_START { \
704       QSORT_NOTICE_SWAP \
705       temp = array[elt1]; \
706       array[elt1] = array[elt2]; \
707       array[elt2] = array[elt3]; \
708       array[elt3] = temp; \
709    } STMT_END
710
711 /* ************************************************************ Debug stuff */
712
713 #ifdef QSORT_DEBUG
714
715 static void
716 break_here()
717 {
718    return; /* good place to set a breakpoint */
719 }
720
721 #define qsort_assert(t) (void)( (t) || (break_here(), 0) )
722
723 static void
724 doqsort_all_asserts(
725    void * array,
726    size_t num_elts,
727    size_t elt_size,
728    int (*compare)(const void * elt1, const void * elt2),
729    int pc_left, int pc_right, int u_left, int u_right)
730 {
731    int i;
732
733    qsort_assert(pc_left <= pc_right);
734    qsort_assert(u_right < pc_left);
735    qsort_assert(pc_right < u_left);
736    for (i = u_right + 1; i < pc_left; ++i) {
737       qsort_assert(qsort_cmp(i, pc_left) < 0);
738    }
739    for (i = pc_left; i < pc_right; ++i) {
740       qsort_assert(qsort_cmp(i, pc_right) == 0);
741    }
742    for (i = pc_right + 1; i < u_left; ++i) {
743       qsort_assert(qsort_cmp(pc_right, i) < 0);
744    }
745 }
746
747 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
748    doqsort_all_asserts(array, num_elts, elt_size, compare, \
749                  PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
750
751 #else
752
753 #define qsort_assert(t) ((void)0)
754
755 #define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
756
757 #endif
758
759 /* ****************************************************************** qsort */
760
761 STATIC void /* the standard unstable (u) quicksort (qsort) */
762 S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare)
763 {
764    register SV * temp;
765
766    struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
767    int next_stack_entry = 0;
768
769    int part_left;
770    int part_right;
771 #ifdef QSORT_ORDER_GUESS
772    int qsort_break_even;
773    int swapped;
774 #endif
775
776    /* Make sure we actually have work to do.
777    */
778    if (num_elts <= 1) {
779       return;
780    }
781
782    /* Innoculate large partitions against quadratic behavior */
783    if (num_elts > QSORT_PLAY_SAFE) {
784       register size_t n;
785       register SV ** const q = array;
786       for (n = num_elts; n > 1; ) {
787          register const size_t j = (size_t)(n-- * Drand01());
788          temp = q[j];
789          q[j] = q[n];
790          q[n] = temp;
791       }
792    }
793
794    /* Setup the initial partition definition and fall into the sorting loop
795    */
796    part_left = 0;
797    part_right = (int)(num_elts - 1);
798 #ifdef QSORT_ORDER_GUESS
799    qsort_break_even = QSORT_BREAK_EVEN;
800 #else
801 #define qsort_break_even QSORT_BREAK_EVEN
802 #endif
803    for ( ; ; ) {
804       if ((part_right - part_left) >= qsort_break_even) {
805          /* OK, this is gonna get hairy, so lets try to document all the
806             concepts and abbreviations and variables and what they keep
807             track of:
808
809             pc: pivot chunk - the set of array elements we accumulate in the
810                 middle of the partition, all equal in value to the original
811                 pivot element selected. The pc is defined by:
812
813                 pc_left - the leftmost array index of the pc
814                 pc_right - the rightmost array index of the pc
815
816                 we start with pc_left == pc_right and only one element
817                 in the pivot chunk (but it can grow during the scan).
818
819             u:  uncompared elements - the set of elements in the partition
820                 we have not yet compared to the pivot value. There are two
821                 uncompared sets during the scan - one to the left of the pc
822                 and one to the right.
823
824                 u_right - the rightmost index of the left side's uncompared set
825                 u_left - the leftmost index of the right side's uncompared set
826
827                 The leftmost index of the left sides's uncompared set
828                 doesn't need its own variable because it is always defined
829                 by the leftmost edge of the whole partition (part_left). The
830                 same goes for the rightmost edge of the right partition
831                 (part_right).
832
833                 We know there are no uncompared elements on the left once we
834                 get u_right < part_left and no uncompared elements on the
835                 right once u_left > part_right. When both these conditions
836                 are met, we have completed the scan of the partition.
837
838                 Any elements which are between the pivot chunk and the
839                 uncompared elements should be less than the pivot value on
840                 the left side and greater than the pivot value on the right
841                 side (in fact, the goal of the whole algorithm is to arrange
842                 for that to be true and make the groups of less-than and
843                 greater-then elements into new partitions to sort again).
844
845             As you marvel at the complexity of the code and wonder why it
846             has to be so confusing. Consider some of the things this level
847             of confusion brings:
848
849             Once I do a compare, I squeeze every ounce of juice out of it. I
850             never do compare calls I don't have to do, and I certainly never
851             do redundant calls.
852
853             I also never swap any elements unless I can prove there is a
854             good reason. Many sort algorithms will swap a known value with
855             an uncompared value just to get things in the right place (or
856             avoid complexity :-), but that uncompared value, once it gets
857             compared, may then have to be swapped again. A lot of the
858             complexity of this code is due to the fact that it never swaps
859             anything except compared values, and it only swaps them when the
860             compare shows they are out of position.
861          */
862          int pc_left, pc_right;
863          int u_right, u_left;
864
865          int s;
866
867          pc_left = ((part_left + part_right) / 2);
868          pc_right = pc_left;
869          u_right = pc_left - 1;
870          u_left = pc_right + 1;
871
872          /* Qsort works best when the pivot value is also the median value
873             in the partition (unfortunately you can't find the median value
874             without first sorting :-), so to give the algorithm a helping
875             hand, we pick 3 elements and sort them and use the median value
876             of that tiny set as the pivot value.
877
878             Some versions of qsort like to use the left middle and right as
879             the 3 elements to sort so they can insure the ends of the
880             partition will contain values which will stop the scan in the
881             compare loop, but when you have to call an arbitrarily complex
882             routine to do a compare, its really better to just keep track of
883             array index values to know when you hit the edge of the
884             partition and avoid the extra compare. An even better reason to
885             avoid using a compare call is the fact that you can drop off the
886             edge of the array if someone foolishly provides you with an
887             unstable compare function that doesn't always provide consistent
888             results.
889
890             So, since it is simpler for us to compare the three adjacent
891             elements in the middle of the partition, those are the ones we
892             pick here (conveniently pointed at by u_right, pc_left, and
893             u_left). The values of the left, center, and right elements
894             are refered to as l c and r in the following comments.
895          */
896
897 #ifdef QSORT_ORDER_GUESS
898          swapped = 0;
899 #endif
900          s = qsort_cmp(u_right, pc_left);
901          if (s < 0) {
902             /* l < c */
903             s = qsort_cmp(pc_left, u_left);
904             /* if l < c, c < r - already in order - nothing to do */
905             if (s == 0) {
906                /* l < c, c == r - already in order, pc grows */
907                ++pc_right;
908                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
909             } else if (s > 0) {
910                /* l < c, c > r - need to know more */
911                s = qsort_cmp(u_right, u_left);
912                if (s < 0) {
913                   /* l < c, c > r, l < r - swap c & r to get ordered */
914                   qsort_swap(pc_left, u_left);
915                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
916                } else if (s == 0) {
917                   /* l < c, c > r, l == r - swap c&r, grow pc */
918                   qsort_swap(pc_left, u_left);
919                   --pc_left;
920                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
921                } else {
922                   /* l < c, c > r, l > r - make lcr into rlc to get ordered */
923                   qsort_rotate(pc_left, u_right, u_left);
924                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
925                }
926             }
927          } else if (s == 0) {
928             /* l == c */
929             s = qsort_cmp(pc_left, u_left);
930             if (s < 0) {
931                /* l == c, c < r - already in order, grow pc */
932                --pc_left;
933                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
934             } else if (s == 0) {
935                /* l == c, c == r - already in order, grow pc both ways */
936                --pc_left;
937                ++pc_right;
938                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
939             } else {
940                /* l == c, c > r - swap l & r, grow pc */
941                qsort_swap(u_right, u_left);
942                ++pc_right;
943                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
944             }
945          } else {
946             /* l > c */
947             s = qsort_cmp(pc_left, u_left);
948             if (s < 0) {
949                /* l > c, c < r - need to know more */
950                s = qsort_cmp(u_right, u_left);
951                if (s < 0) {
952                   /* l > c, c < r, l < r - swap l & c to get ordered */
953                   qsort_swap(u_right, pc_left);
954                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
955                } else if (s == 0) {
956                   /* l > c, c < r, l == r - swap l & c, grow pc */
957                   qsort_swap(u_right, pc_left);
958                   ++pc_right;
959                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
960                } else {
961                   /* l > c, c < r, l > r - rotate lcr into crl to order */
962                   qsort_rotate(u_right, pc_left, u_left);
963                   qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
964                }
965             } else if (s == 0) {
966                /* l > c, c == r - swap ends, grow pc */
967                qsort_swap(u_right, u_left);
968                --pc_left;
969                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
970             } else {
971                /* l > c, c > r - swap ends to get in order */
972                qsort_swap(u_right, u_left);
973                qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
974             }
975          }
976          /* We now know the 3 middle elements have been compared and
977             arranged in the desired order, so we can shrink the uncompared
978             sets on both sides
979          */
980          --u_right;
981          ++u_left;
982          qsort_all_asserts(pc_left, pc_right, u_left, u_right);
983
984          /* The above massive nested if was the simple part :-). We now have
985             the middle 3 elements ordered and we need to scan through the
986             uncompared sets on either side, swapping elements that are on
987             the wrong side or simply shuffling equal elements around to get
988             all equal elements into the pivot chunk.
989          */
990
991          for ( ; ; ) {
992             int still_work_on_left;
993             int still_work_on_right;
994
995             /* Scan the uncompared values on the left. If I find a value
996                equal to the pivot value, move it over so it is adjacent to
997                the pivot chunk and expand the pivot chunk. If I find a value
998                less than the pivot value, then just leave it - its already
999                on the correct side of the partition. If I find a greater
1000                value, then stop the scan.
1001             */
1002             while ((still_work_on_left = (u_right >= part_left))) {
1003                s = qsort_cmp(u_right, pc_left);
1004                if (s < 0) {
1005                   --u_right;
1006                } else if (s == 0) {
1007                   --pc_left;
1008                   if (pc_left != u_right) {
1009                      qsort_swap(u_right, pc_left);
1010                   }
1011                   --u_right;
1012                } else {
1013                   break;
1014                }
1015                qsort_assert(u_right < pc_left);
1016                qsort_assert(pc_left <= pc_right);
1017                qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
1018                qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
1019             }
1020
1021             /* Do a mirror image scan of uncompared values on the right
1022             */
1023             while ((still_work_on_right = (u_left <= part_right))) {
1024                s = qsort_cmp(pc_right, u_left);
1025                if (s < 0) {
1026                   ++u_left;
1027                } else if (s == 0) {
1028                   ++pc_right;
1029                   if (pc_right != u_left) {
1030                      qsort_swap(pc_right, u_left);
1031                   }
1032                   ++u_left;
1033                } else {
1034                   break;
1035                }
1036                qsort_assert(u_left > pc_right);
1037                qsort_assert(pc_left <= pc_right);
1038                qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
1039                qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
1040             }
1041
1042             if (still_work_on_left) {
1043                /* I know I have a value on the left side which needs to be
1044                   on the right side, but I need to know more to decide
1045                   exactly the best thing to do with it.
1046                */
1047                if (still_work_on_right) {
1048                   /* I know I have values on both side which are out of
1049                      position. This is a big win because I kill two birds
1050                      with one swap (so to speak). I can advance the
1051                      uncompared pointers on both sides after swapping both
1052                      of them into the right place.
1053                   */
1054                   qsort_swap(u_right, u_left);
1055                   --u_right;
1056                   ++u_left;
1057                   qsort_all_asserts(pc_left, pc_right, u_left, u_right);
1058                } else {
1059                   /* I have an out of position value on the left, but the
1060                      right is fully scanned, so I "slide" the pivot chunk
1061                      and any less-than values left one to make room for the
1062                      greater value over on the right. If the out of position
1063                      value is immediately adjacent to the pivot chunk (there
1064                      are no less-than values), I can do that with a swap,
1065                      otherwise, I have to rotate one of the less than values
1066                      into the former position of the out of position value
1067                      and the right end of the pivot chunk into the left end
1068                      (got all that?).
1069                   */
1070                   --pc_left;
1071                   if (pc_left == u_right) {
1072                      qsort_swap(u_right, pc_right);
1073                      qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
1074                   } else {
1075                      qsort_rotate(u_right, pc_left, pc_right);
1076                      qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
1077                   }
1078                   --pc_right;
1079                   --u_right;
1080                }
1081             } else if (still_work_on_right) {
1082                /* Mirror image of complex case above: I have an out of
1083                   position value on the right, but the left is fully
1084                   scanned, so I need to shuffle things around to make room
1085                   for the right value on the left.
1086                */
1087                ++pc_right;
1088                if (pc_right == u_left) {
1089                   qsort_swap(u_left, pc_left);
1090                   qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
1091                } else {
1092                   qsort_rotate(pc_right, pc_left, u_left);
1093                   qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
1094                }
1095                ++pc_left;
1096                ++u_left;
1097             } else {
1098                /* No more scanning required on either side of partition,
1099                   break out of loop and figure out next set of partitions
1100                */
1101                break;
1102             }
1103          }
1104
1105          /* The elements in the pivot chunk are now in the right place. They
1106             will never move or be compared again. All I have to do is decide
1107             what to do with the stuff to the left and right of the pivot
1108             chunk.
1109
1110             Notes on the QSORT_ORDER_GUESS ifdef code:
1111
1112             1. If I just built these partitions without swapping any (or
1113                very many) elements, there is a chance that the elements are
1114                already ordered properly (being properly ordered will
1115                certainly result in no swapping, but the converse can't be
1116                proved :-).
1117
1118             2. A (properly written) insertion sort will run faster on
1119                already ordered data than qsort will.
1120
1121             3. Perhaps there is some way to make a good guess about
1122                switching to an insertion sort earlier than partition size 6
1123                (for instance - we could save the partition size on the stack
1124                and increase the size each time we find we didn't swap, thus
1125                switching to insertion sort earlier for partitions with a
1126                history of not swapping).
1127
1128             4. Naturally, if I just switch right away, it will make
1129                artificial benchmarks with pure ascending (or descending)
1130                data look really good, but is that a good reason in general?
1131                Hard to say...
1132          */
1133
1134 #ifdef QSORT_ORDER_GUESS
1135          if (swapped < 3) {
1136 #if QSORT_ORDER_GUESS == 1
1137             qsort_break_even = (part_right - part_left) + 1;
1138 #endif
1139 #if QSORT_ORDER_GUESS == 2
1140             qsort_break_even *= 2;
1141 #endif
1142 #if QSORT_ORDER_GUESS == 3
1143             const int prev_break = qsort_break_even;
1144             qsort_break_even *= qsort_break_even;
1145             if (qsort_break_even < prev_break) {
1146                qsort_break_even = (part_right - part_left) + 1;
1147             }
1148 #endif
1149          } else {
1150             qsort_break_even = QSORT_BREAK_EVEN;
1151          }
1152 #endif
1153
1154          if (part_left < pc_left) {
1155             /* There are elements on the left which need more processing.
1156                Check the right as well before deciding what to do.
1157             */
1158             if (pc_right < part_right) {
1159                /* We have two partitions to be sorted. Stack the biggest one
1160                   and process the smallest one on the next iteration. This
1161                   minimizes the stack height by insuring that any additional
1162                   stack entries must come from the smallest partition which
1163                   (because it is smallest) will have the fewest
1164                   opportunities to generate additional stack entries.
1165                */
1166                if ((part_right - pc_right) > (pc_left - part_left)) {
1167                   /* stack the right partition, process the left */
1168                   partition_stack[next_stack_entry].left = pc_right + 1;
1169                   partition_stack[next_stack_entry].right = part_right;
1170 #ifdef QSORT_ORDER_GUESS
1171                   partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
1172 #endif
1173                   part_right = pc_left - 1;
1174                } else {
1175                   /* stack the left partition, process the right */
1176                   partition_stack[next_stack_entry].left = part_left;
1177                   partition_stack[next_stack_entry].right = pc_left - 1;
1178 #ifdef QSORT_ORDER_GUESS
1179                   partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
1180 #endif
1181                   part_left = pc_right + 1;
1182                }
1183                qsort_assert(next_stack_entry < QSORT_MAX_STACK);
1184                ++next_stack_entry;
1185             } else {
1186                /* The elements on the left are the only remaining elements
1187                   that need sorting, arrange for them to be processed as the
1188                   next partition.
1189                */
1190                part_right = pc_left - 1;
1191             }
1192          } else if (pc_right < part_right) {
1193             /* There is only one chunk on the right to be sorted, make it
1194                the new partition and loop back around.
1195             */
1196             part_left = pc_right + 1;
1197          } else {
1198             /* This whole partition wound up in the pivot chunk, so
1199                we need to get a new partition off the stack.
1200             */
1201             if (next_stack_entry == 0) {
1202                /* the stack is empty - we are done */
1203                break;
1204             }
1205             --next_stack_entry;
1206             part_left = partition_stack[next_stack_entry].left;
1207             part_right = partition_stack[next_stack_entry].right;
1208 #ifdef QSORT_ORDER_GUESS
1209             qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
1210 #endif
1211          }
1212       } else {
1213          /* This partition is too small to fool with qsort complexity, just
1214             do an ordinary insertion sort to minimize overhead.
1215          */
1216          int i;
1217          /* Assume 1st element is in right place already, and start checking
1218             at 2nd element to see where it should be inserted.
1219          */
1220          for (i = part_left + 1; i <= part_right; ++i) {
1221             int j;
1222             /* Scan (backwards - just in case 'i' is already in right place)
1223                through the elements already sorted to see if the ith element
1224                belongs ahead of one of them.
1225             */
1226             for (j = i - 1; j >= part_left; --j) {
1227                if (qsort_cmp(i, j) >= 0) {
1228                   /* i belongs right after j
1229                   */
1230                   break;
1231                }
1232             }
1233             ++j;
1234             if (j != i) {
1235                /* Looks like we really need to move some things
1236                */
1237                int k;
1238                temp = array[i];
1239                for (k = i - 1; k >= j; --k)
1240                   array[k + 1] = array[k];
1241                array[j] = temp;
1242             }
1243          }
1244
1245          /* That partition is now sorted, grab the next one, or get out
1246             of the loop if there aren't any more.
1247          */
1248
1249          if (next_stack_entry == 0) {
1250             /* the stack is empty - we are done */
1251             break;
1252          }
1253          --next_stack_entry;
1254          part_left = partition_stack[next_stack_entry].left;
1255          part_right = partition_stack[next_stack_entry].right;
1256 #ifdef QSORT_ORDER_GUESS
1257          qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
1258 #endif
1259       }
1260    }
1261
1262    /* Believe it or not, the array is sorted at this point! */
1263 }
1264
1265 /* Stabilize what is, presumably, an otherwise unstable sort method.
1266  * We do that by allocating (or having on hand) an array of pointers
1267  * that is the same size as the original array of elements to be sorted.
1268  * We initialize this parallel array with the addresses of the original
1269  * array elements.  This indirection can make you crazy.
1270  * Some pictures can help.  After initializing, we have
1271  *
1272  *  indir                  list1
1273  * +----+                 +----+
1274  * |    | --------------> |    | ------> first element to be sorted
1275  * +----+                 +----+
1276  * |    | --------------> |    | ------> second element to be sorted
1277  * +----+                 +----+
1278  * |    | --------------> |    | ------> third element to be sorted
1279  * +----+                 +----+
1280  *  ...
1281  * +----+                 +----+
1282  * |    | --------------> |    | ------> n-1st element to be sorted
1283  * +----+                 +----+
1284  * |    | --------------> |    | ------> n-th element to be sorted
1285  * +----+                 +----+
1286  *
1287  * During the sort phase, we leave the elements of list1 where they are,
1288  * and sort the pointers in the indirect array in the same order determined
1289  * by the original comparison routine on the elements pointed to.
1290  * Because we don't move the elements of list1 around through
1291  * this phase, we can break ties on elements that compare equal
1292  * using their address in the list1 array, ensuring stabilty.
1293  * This leaves us with something looking like
1294  *
1295  *  indir                  list1
1296  * +----+                 +----+
1297  * |    | --+       +---> |    | ------> first element to be sorted
1298  * +----+   |       |     +----+
1299  * |    | --|-------|---> |    | ------> second element to be sorted
1300  * +----+   |       |     +----+
1301  * |    | --|-------+ +-> |    | ------> third element to be sorted
1302  * +----+   |         |   +----+
1303  *  ...
1304  * +----+    | |   | |    +----+
1305  * |    | ---|-+   | +--> |    | ------> n-1st element to be sorted
1306  * +----+    |     |      +----+
1307  * |    | ---+     +----> |    | ------> n-th element to be sorted
1308  * +----+                 +----+
1309  *
1310  * where the i-th element of the indirect array points to the element
1311  * that should be i-th in the sorted array.  After the sort phase,
1312  * we have to put the elements of list1 into the places
1313  * dictated by the indirect array.
1314  */
1315
1316
1317 static I32
1318 cmpindir(pTHX_ gptr a, gptr b)
1319 {
1320     dVAR;
1321     gptr * const ap = (gptr *)a;
1322     gptr * const bp = (gptr *)b;
1323     const I32 sense = PL_sort_RealCmp(aTHX_ *ap, *bp);
1324
1325     if (sense)
1326         return sense;
1327     return (ap > bp) ? 1 : ((ap < bp) ? -1 : 0);
1328 }
1329
1330 static I32
1331 cmpindir_desc(pTHX_ gptr a, gptr b)
1332 {
1333     dVAR;
1334     gptr * const ap = (gptr *)a;
1335     gptr * const bp = (gptr *)b;
1336     const I32 sense = PL_sort_RealCmp(aTHX_ *ap, *bp);
1337
1338     /* Reverse the default */
1339     if (sense)
1340         return -sense;
1341     /* But don't reverse the stability test.  */
1342     return (ap > bp) ? 1 : ((ap < bp) ? -1 : 0);
1343
1344 }
1345
1346 STATIC void
1347 S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
1348 {
1349     dVAR;
1350     if ((flags & SORTf_STABLE) != 0) {
1351          register gptr **pp, *q;
1352          register size_t n, j, i;
1353          gptr *small[SMALLSORT], **indir, tmp;
1354          SVCOMPARE_t savecmp;
1355          if (nmemb <= 1) return;     /* sorted trivially */
1356
1357          /* Small arrays can use the stack, big ones must be allocated */
1358          if (nmemb <= SMALLSORT) indir = small;
1359          else { Newx(indir, nmemb, gptr *); }
1360
1361          /* Copy pointers to original array elements into indirect array */
1362          for (n = nmemb, pp = indir, q = list1; n--; ) *pp++ = q++;
1363
1364          savecmp = PL_sort_RealCmp;     /* Save current comparison routine, if any */
1365          PL_sort_RealCmp = cmp; /* Put comparison routine where cmpindir can find it */
1366
1367          /* sort, with indirection */
1368          if (flags & SORTf_DESC)
1369             qsortsvu((gptr *)indir, nmemb, cmpindir_desc);
1370         else
1371             qsortsvu((gptr *)indir, nmemb, cmpindir);
1372
1373          pp = indir;
1374          q = list1;
1375          for (n = nmemb; n--; ) {
1376               /* Assert A: all elements of q with index > n are already
1377                * in place.  This is vacuosly true at the start, and we
1378                * put element n where it belongs below (if it wasn't
1379                * already where it belonged). Assert B: we only move
1380                * elements that aren't where they belong,
1381                * so, by A, we never tamper with elements above n.
1382                */
1383               j = pp[n] - q;            /* This sets j so that q[j] is
1384                                          * at pp[n].  *pp[j] belongs in
1385                                          * q[j], by construction.
1386                                          */
1387               if (n != j) {             /* all's well if n == j */
1388                    tmp = q[j];          /* save what's in q[j] */
1389                    do {
1390                         q[j] = *pp[j];  /* put *pp[j] where it belongs */
1391                         i = pp[j] - q;  /* the index in q of the element
1392                                          * just moved */
1393                         pp[j] = q + j;  /* this is ok now */
1394                    } while ((j = i) != n);
1395                    /* There are only finitely many (nmemb) addresses
1396                     * in the pp array.
1397                     * So we must eventually revisit an index we saw before.
1398                     * Suppose the first revisited index is k != n.
1399                     * An index is visited because something else belongs there.
1400                     * If we visit k twice, then two different elements must
1401                     * belong in the same place, which cannot be.
1402                     * So j must get back to n, the loop terminates,
1403                     * and we put the saved element where it belongs.
1404                     */
1405                    q[n] = tmp;          /* put what belongs into
1406                                          * the n-th element */
1407               }
1408          }
1409
1410         /* free iff allocated */
1411          if (indir != small) { Safefree(indir); }
1412          /* restore prevailing comparison routine */
1413          PL_sort_RealCmp = savecmp;
1414     } else if ((flags & SORTf_DESC) != 0) {
1415          const SVCOMPARE_t savecmp = PL_sort_RealCmp;   /* Save current comparison routine, if any */
1416          PL_sort_RealCmp = cmp; /* Put comparison routine where cmp_desc can find it */
1417          cmp = cmp_desc;
1418          qsortsvu(list1, nmemb, cmp);
1419          /* restore prevailing comparison routine */
1420          PL_sort_RealCmp = savecmp;
1421     } else {
1422          qsortsvu(list1, nmemb, cmp);
1423     }
1424 }
1425
1426 /*
1427 =head1 Array Manipulation Functions
1428
1429 =for apidoc sortsv
1430
1431 Sort an array. Here is an example:
1432
1433     sortsv(AvARRAY(av), av_len(av)+1, Perl_sv_cmp_locale);
1434
1435 Currently this always uses mergesort. See sortsv_flags for a more
1436 flexible routine.
1437
1438 =cut
1439 */
1440
1441 void
1442 Perl_sortsv(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp)
1443 {
1444     sortsv_flags(array, nmemb, cmp, 0);
1445 }
1446
1447 /*
1448 =for apidoc sortsv_flags
1449
1450 Sort an array, with various options.
1451
1452 =cut
1453 */
1454 void
1455 Perl_sortsv_flags(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
1456 {
1457     if (flags & SORTf_QSORT)
1458         S_qsortsv(aTHX_ array, nmemb, cmp, flags);
1459     else
1460         S_mergesortsv(aTHX_ array, nmemb, cmp, flags);
1461 }
1462
1463 #define SvNSIOK(sv) ((SvFLAGS(sv) & SVf_NOK) || ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) == SVf_IOK))
1464 #define SvSIOK(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) == SVf_IOK)
1465 #define SvNSIV(sv) ( SvNOK(sv) ? SvNVX(sv) : ( SvSIOK(sv) ? SvIVX(sv) : sv_2nv(sv) ) )
1466
1467 PP(pp_sort)
1468 {
1469     dVAR; dSP; dMARK; dORIGMARK;
1470     register SV **p1 = ORIGMARK+1, **p2;
1471     register I32 max, i;
1472     AV* av = NULL;
1473     HV *stash;
1474     GV *gv;
1475     CV *cv = NULL;
1476     I32 gimme = GIMME;
1477     OP* const nextop = PL_op->op_next;
1478     I32 overloading = 0;
1479     bool hasargs = FALSE;
1480     I32 is_xsub = 0;
1481     I32 sorting_av = 0;
1482     const U8 priv = PL_op->op_private;
1483     const U8 flags = PL_op->op_flags;
1484     U32 sort_flags = 0;
1485     void (*sortsvp)(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
1486       = Perl_sortsv_flags;
1487     I32 all_SIVs = 1;
1488
1489     if ((priv & OPpSORT_DESCEND) != 0)
1490         sort_flags |= SORTf_DESC;
1491     if ((priv & OPpSORT_QSORT) != 0)
1492         sort_flags |= SORTf_QSORT;
1493     if ((priv & OPpSORT_STABLE) != 0)
1494         sort_flags |= SORTf_STABLE;
1495
1496     if (gimme != G_ARRAY) {
1497         SP = MARK;
1498         EXTEND(SP,1);
1499         RETPUSHUNDEF;
1500     }
1501
1502     ENTER;
1503     SAVEVPTR(PL_sortcop);
1504     if (flags & OPf_STACKED) {
1505         if (flags & OPf_SPECIAL) {
1506             OP *kid = cLISTOP->op_first->op_sibling;    /* pass pushmark */
1507             kid = kUNOP->op_first;                      /* pass rv2gv */
1508             kid = kUNOP->op_first;                      /* pass leave */
1509             PL_sortcop = kid->op_next;
1510             stash = CopSTASH(PL_curcop);
1511         }
1512         else {
1513             cv = sv_2cv(*++MARK, &stash, &gv, 0);
1514             if (cv && SvPOK(cv)) {
1515                 const char * const proto = SvPV_nolen_const((SV*)cv);
1516                 if (proto && strEQ(proto, "$$")) {
1517                     hasargs = TRUE;
1518                 }
1519             }
1520             if (!(cv && CvROOT(cv))) {
1521                 if (cv && CvISXSUB(cv)) {
1522                     is_xsub = 1;
1523                 }
1524                 else if (gv) {
1525                     SV *tmpstr = sv_newmortal();
1526                     gv_efullname3(tmpstr, gv, NULL);
1527                     DIE(aTHX_ "Undefined sort subroutine \"%"SVf"\" called",
1528                         SVfARG(tmpstr));
1529                 }
1530                 else {
1531                     DIE(aTHX_ "Undefined subroutine in sort");
1532                 }
1533             }
1534
1535             if (is_xsub)
1536                 PL_sortcop = (OP*)cv;
1537             else
1538                 PL_sortcop = CvSTART(cv);
1539         }
1540     }
1541     else {
1542         PL_sortcop = NULL;
1543         stash = CopSTASH(PL_curcop);
1544     }
1545
1546     /* optimiser converts "@a = sort @a" to "sort \@a";
1547      * in case of tied @a, pessimise: push (@a) onto stack, then assign
1548      * result back to @a at the end of this function */
1549     if (priv & OPpSORT_INPLACE) {
1550         assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV);
1551         (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */
1552         av = (AV*)(*SP);
1553         max = AvFILL(av) + 1;
1554         if (SvMAGICAL(av)) {
1555             MEXTEND(SP, max);
1556             p2 = SP;
1557             for (i=0; i < max; i++) {
1558                 SV **svp = av_fetch(av, i, FALSE);
1559                 *SP++ = (svp) ? *svp : NULL;
1560             }
1561         }
1562         else {
1563             if (SvREADONLY(av))
1564                 Perl_croak(aTHX_ PL_no_modify);
1565             else
1566                 SvREADONLY_on(av);
1567             p1 = p2 = AvARRAY(av);
1568             sorting_av = 1;
1569         }
1570     }
1571     else {
1572         p2 = MARK+1;
1573         max = SP - MARK;
1574    }
1575
1576     /* shuffle stack down, removing optional initial cv (p1!=p2), plus
1577      * any nulls; also stringify or converting to integer or number as
1578      * required any args */
1579     for (i=max; i > 0 ; i--) {
1580         if ((*p1 = *p2++)) {                    /* Weed out nulls. */
1581             SvTEMP_off(*p1);
1582             if (!PL_sortcop) {
1583                 if (priv & OPpSORT_NUMERIC) {
1584                     if (priv & OPpSORT_INTEGER) {
1585                         if (!SvIOK(*p1)) {
1586                             if (SvAMAGIC(*p1))
1587                                 overloading = 1;
1588                             else
1589                                 (void)sv_2iv(*p1);
1590                         }
1591                     }
1592                     else {
1593                         if (!SvNSIOK(*p1)) {
1594                             if (SvAMAGIC(*p1))
1595                                 overloading = 1;
1596                             else
1597                                 (void)sv_2nv(*p1);
1598                         }
1599                         if (all_SIVs && !SvSIOK(*p1))
1600                             all_SIVs = 0;
1601                     }
1602                 }
1603                 else {
1604                     if (!SvPOK(*p1)) {
1605                         if (SvAMAGIC(*p1))
1606                             overloading = 1;
1607                         else
1608                             (void)sv_2pv_flags(*p1, 0,
1609                                                SV_GMAGIC|SV_CONST_RETURN);
1610                     }
1611                 }
1612             }
1613             p1++;
1614         }
1615         else
1616             max--;
1617     }
1618     if (sorting_av)
1619         AvFILLp(av) = max-1;
1620
1621     if (max > 1) {
1622         SV **start;
1623         if (PL_sortcop) {
1624             PERL_CONTEXT *cx;
1625             SV** newsp;
1626             const bool oldcatch = CATCH_GET;
1627
1628             SAVETMPS;
1629             SAVEOP();
1630
1631             CATCH_SET(TRUE);
1632             PUSHSTACKi(PERLSI_SORT);
1633             if (!hasargs && !is_xsub) {
1634                 SAVESPTR(PL_firstgv);
1635                 SAVESPTR(PL_secondgv);
1636                 SAVESPTR(PL_sortstash);
1637                 PL_firstgv = gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV);
1638                 PL_secondgv = gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV);
1639                 PL_sortstash = stash;
1640                 SAVESPTR(GvSV(PL_firstgv));
1641                 SAVESPTR(GvSV(PL_secondgv));
1642             }
1643
1644             PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
1645             if (!(flags & OPf_SPECIAL)) {
1646                 cx->cx_type = CXt_SUB;
1647                 cx->blk_gimme = G_SCALAR;
1648                 PUSHSUB(cx);
1649                 if (!is_xsub) {
1650                     AV* const padlist = CvPADLIST(cv);
1651
1652                     if (++CvDEPTH(cv) >= 2) {
1653                         PERL_STACK_OVERFLOW_CHECK();
1654                         pad_push(padlist, CvDEPTH(cv));
1655                     }
1656                     SAVECOMPPAD();
1657                     PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
1658
1659                     if (hasargs) {
1660                         /* This is mostly copied from pp_entersub */
1661                         AV * const av = (AV*)PAD_SVl(0);
1662
1663                         cx->blk_sub.savearray = GvAV(PL_defgv);
1664                         GvAV(PL_defgv) = (AV*)SvREFCNT_inc_simple(av);
1665                         CX_CURPAD_SAVE(cx->blk_sub);
1666                         cx->blk_sub.argarray = av;
1667                     }
1668
1669                 }
1670             }
1671             cx->cx_type |= CXp_MULTICALL;
1672             
1673             start = p1 - max;
1674             sortsvp(aTHX_ start, max,
1675                     (is_xsub ? S_sortcv_xsub : hasargs ? S_sortcv_stacked : S_sortcv),
1676                     sort_flags);
1677
1678             if (!(flags & OPf_SPECIAL)) {
1679                 LEAVESUB(cv);
1680                 if (!is_xsub)
1681                     CvDEPTH(cv)--;
1682             }
1683             POPBLOCK(cx,PL_curpm);
1684             PL_stack_sp = newsp;
1685             POPSTACK;
1686             CATCH_SET(oldcatch);
1687         }
1688         else {
1689             MEXTEND(SP, 20);    /* Can't afford stack realloc on signal. */
1690             start = sorting_av ? AvARRAY(av) : ORIGMARK+1;
1691             sortsvp(aTHX_ start, max,
1692                     (priv & OPpSORT_NUMERIC)
1693                         ? ( ( ( priv & OPpSORT_INTEGER) || all_SIVs)
1694                             ? ( overloading ? S_amagic_i_ncmp : S_sv_i_ncmp)
1695                             : ( overloading ? S_amagic_ncmp : S_sv_ncmp ) )
1696                         : ( IN_LOCALE_RUNTIME
1697                             ? ( overloading
1698                                 ? (SVCOMPARE_t)S_amagic_cmp_locale
1699                                 : (SVCOMPARE_t)sv_cmp_locale_static)
1700                             : ( overloading ? (SVCOMPARE_t)S_amagic_cmp : (SVCOMPARE_t)sv_cmp_static)),
1701                     sort_flags);
1702         }
1703         if ((priv & OPpSORT_REVERSE) != 0) {
1704             SV **q = start+max-1;
1705             while (start < q) {
1706                 SV * const tmp = *start;
1707                 *start++ = *q;
1708                 *q-- = tmp;
1709             }
1710         }
1711     }
1712     if (sorting_av)
1713         SvREADONLY_off(av);
1714     else if (av && !sorting_av) {
1715         /* simulate pp_aassign of tied AV */
1716         SV** const base = ORIGMARK+1;
1717         for (i=0; i < max; i++) {
1718             base[i] = newSVsv(base[i]);
1719         }
1720         av_clear(av);
1721         av_extend(av, max);
1722         for (i=0; i < max; i++) {
1723             SV * const sv = base[i];
1724             SV ** const didstore = av_store(av, i, sv);
1725             if (SvSMAGICAL(sv))
1726                 mg_set(sv);
1727             if (!didstore)
1728                 sv_2mortal(sv);
1729         }
1730     }
1731     LEAVE;
1732     PL_stack_sp = ORIGMARK + (sorting_av ? 0 : max);
1733     return nextop;
1734 }
1735
1736 static I32
1737 S_sortcv(pTHX_ SV *a, SV *b)
1738 {
1739     dVAR;
1740     const I32 oldsaveix = PL_savestack_ix;
1741     const I32 oldscopeix = PL_scopestack_ix;
1742     I32 result;
1743     GvSV(PL_firstgv) = a;
1744     GvSV(PL_secondgv) = b;
1745     PL_stack_sp = PL_stack_base;
1746     PL_op = PL_sortcop;
1747     CALLRUNOPS(aTHX);
1748     if (PL_stack_sp != PL_stack_base + 1)
1749         Perl_croak(aTHX_ "Sort subroutine didn't return single value");
1750     if (!SvNIOKp(*PL_stack_sp))
1751         Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
1752     result = SvIV(*PL_stack_sp);
1753     while (PL_scopestack_ix > oldscopeix) {
1754         LEAVE;
1755     }
1756     leave_scope(oldsaveix);
1757     return result;
1758 }
1759
1760 static I32
1761 S_sortcv_stacked(pTHX_ SV *a, SV *b)
1762 {
1763     dVAR;
1764     const I32 oldsaveix = PL_savestack_ix;
1765     const I32 oldscopeix = PL_scopestack_ix;
1766     I32 result;
1767     AV * const av = GvAV(PL_defgv);
1768
1769     if (AvMAX(av) < 1) {
1770         SV** ary = AvALLOC(av);
1771         if (AvARRAY(av) != ary) {
1772             AvMAX(av) += AvARRAY(av) - AvALLOC(av);
1773             AvARRAY(av) = ary;
1774         }
1775         if (AvMAX(av) < 1) {
1776             AvMAX(av) = 1;
1777             Renew(ary,2,SV*);
1778             AvARRAY(av) = ary;
1779         }
1780     }
1781     AvFILLp(av) = 1;
1782
1783     AvARRAY(av)[0] = a;
1784     AvARRAY(av)[1] = b;
1785     PL_stack_sp = PL_stack_base;
1786     PL_op = PL_sortcop;
1787     CALLRUNOPS(aTHX);
1788     if (PL_stack_sp != PL_stack_base + 1)
1789         Perl_croak(aTHX_ "Sort subroutine didn't return single value");
1790     if (!SvNIOKp(*PL_stack_sp))
1791         Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
1792     result = SvIV(*PL_stack_sp);
1793     while (PL_scopestack_ix > oldscopeix) {
1794         LEAVE;
1795     }
1796     leave_scope(oldsaveix);
1797     return result;
1798 }
1799
1800 static I32
1801 S_sortcv_xsub(pTHX_ SV *a, SV *b)
1802 {
1803     dVAR; dSP;
1804     const I32 oldsaveix = PL_savestack_ix;
1805     const I32 oldscopeix = PL_scopestack_ix;
1806     CV * const cv=(CV*)PL_sortcop;
1807     I32 result;
1808
1809     SP = PL_stack_base;
1810     PUSHMARK(SP);
1811     EXTEND(SP, 2);
1812     *++SP = a;
1813     *++SP = b;
1814     PUTBACK;
1815     (void)(*CvXSUB(cv))(aTHX_ cv);
1816     if (PL_stack_sp != PL_stack_base + 1)
1817         Perl_croak(aTHX_ "Sort subroutine didn't return single value");
1818     if (!SvNIOKp(*PL_stack_sp))
1819         Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
1820     result = SvIV(*PL_stack_sp);
1821     while (PL_scopestack_ix > oldscopeix) {
1822         LEAVE;
1823     }
1824     leave_scope(oldsaveix);
1825     return result;
1826 }
1827
1828
1829 static I32
1830 S_sv_ncmp(pTHX_ SV *a, SV *b)
1831 {
1832     const NV nv1 = SvNSIV(a);
1833     const NV nv2 = SvNSIV(b);
1834     return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
1835 }
1836
1837 static I32
1838 S_sv_i_ncmp(pTHX_ SV *a, SV *b)
1839 {
1840     const IV iv1 = SvIV(a);
1841     const IV iv2 = SvIV(b);
1842     return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0;
1843 }
1844
1845 #define tryCALL_AMAGICbin(left,right,meth) \
1846     (PL_amagic_generation && (SvAMAGIC(left)||SvAMAGIC(right))) \
1847         ? amagic_call(left, right, CAT2(meth,_amg), 0) \
1848         : NULL;
1849
1850 #define SORT_NORMAL_RETURN_VALUE(val)  (((val) > 0) ? 1 : ((val) ? -1 : 0))
1851
1852 static I32
1853 S_amagic_ncmp(pTHX_ register SV *a, register SV *b)
1854 {
1855     dVAR;
1856     SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp);
1857     if (tmpsv) {
1858         if (SvIOK(tmpsv)) {
1859             const I32 i = SvIVX(tmpsv);
1860             return SORT_NORMAL_RETURN_VALUE(i);
1861         }
1862         else {
1863             const NV d = SvNV(tmpsv);
1864             return SORT_NORMAL_RETURN_VALUE(d);
1865         }
1866      }
1867      return S_sv_ncmp(aTHX_ a, b);
1868 }
1869
1870 static I32
1871 S_amagic_i_ncmp(pTHX_ register SV *a, register SV *b)
1872 {
1873     dVAR;
1874     SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp);
1875     if (tmpsv) {
1876         if (SvIOK(tmpsv)) {
1877             const I32 i = SvIVX(tmpsv);
1878             return SORT_NORMAL_RETURN_VALUE(i);
1879         }
1880         else {
1881             const NV d = SvNV(tmpsv);
1882             return SORT_NORMAL_RETURN_VALUE(d);
1883         }
1884     }
1885     return S_sv_i_ncmp(aTHX_ a, b);
1886 }
1887
1888 static I32
1889 S_amagic_cmp(pTHX_ register SV *str1, register SV *str2)
1890 {
1891     dVAR;
1892     SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp);
1893     if (tmpsv) {
1894         if (SvIOK(tmpsv)) {
1895             const I32 i = SvIVX(tmpsv);
1896             return SORT_NORMAL_RETURN_VALUE(i);
1897         }
1898         else {
1899             const NV d = SvNV(tmpsv);
1900             return SORT_NORMAL_RETURN_VALUE(d);
1901         }
1902     }
1903     return sv_cmp(str1, str2);
1904 }
1905
1906 static I32
1907 S_amagic_cmp_locale(pTHX_ register SV *str1, register SV *str2)
1908 {
1909     dVAR;
1910     SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp);
1911     if (tmpsv) {
1912         if (SvIOK(tmpsv)) {
1913             const I32 i = SvIVX(tmpsv);
1914             return SORT_NORMAL_RETURN_VALUE(i);
1915         }
1916         else {
1917             const NV d = SvNV(tmpsv);
1918             return SORT_NORMAL_RETURN_VALUE(d);
1919         }
1920     }
1921     return sv_cmp_locale(str1, str2);
1922 }
1923
1924 /*
1925  * Local variables:
1926  * c-indentation-style: bsd
1927  * c-basic-offset: 4
1928  * indent-tabs-mode: t
1929  * End:
1930  *
1931  * ex: set ts=8 sts=4 sw=4 noet:
1932  */