This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_sort.c: Tinker with pp_sort to untickle mingw bug
authorYves Orton <demerphq@gmail.com>
Sun, 2 Feb 2020 13:15:18 +0000 (14:15 +0100)
committerYves Orton <demerphq@gmail.com>
Tue, 4 Feb 2020 10:57:09 +0000 (11:57 +0100)
pp_sort.c

index 4f81aaa..7e0ef06 100644 (file)
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -1063,13 +1063,14 @@ PP(pp_sort)
     if (av) {
         /* copy back result to the array */
         SV** const base = MARK+1;
+        SSize_t max_minus_one = max - 1; /* attempt to work around mingw bug */
         if (SvMAGICAL(av)) {
-            for (i = 0; i < max; i++)
+            for (i = 0; i <= max_minus_one; i++)
                 base[i] = newSVsv(base[i]);
             av_clear(av);
-            if (max)
-                av_extend(av, max-1);
-            for (i=0; i < max; i++) {
+            if (max_minus_one >= 0)
+                av_extend(av, max_minus_one);
+            for (i=0; i <= max_minus_one; i++) {
                 SV * const sv = base[i];
                 SV ** const didstore = av_store(av, i, sv);
                 if (SvSMAGICAL(sv))
@@ -1085,7 +1086,7 @@ PP(pp_sort)
              * in the meantime. So bump and unbump the relevant refcounts
              * first.
              */
-            for (i = 0; i < max; i++) {
+            for (i = 0; i <= max_minus_one; i++) {
                 SV *sv = base[i];
                 assert(sv);
                 if (SvREFCNT(sv) > 1)
@@ -1094,11 +1095,11 @@ PP(pp_sort)
                     SvREFCNT_inc_simple_void_NN(sv);
             }
             av_clear(av);
-            if (max > 0) {
-                av_extend(av, max-1);
+            if (max_minus_one >= 0) {
+                av_extend(av, max_minus_one);
                 Copy(base, AvARRAY(av), max, SV*);
             }
-            AvFILLp(av) = max - 1;
+            AvFILLp(av) = max_minus_one;
             AvREIFY_off(av);
             AvREAL_on(av);
         }