Change 24708 by [EMAIL PROTECTED] on 2005/06/05 11:14:41

        Subject: PATCH for [perl #36043] '@foo = sort { $a <=> $b } @bar' uses 
too much memory
        From: Salvador Fandi�o <[EMAIL PROTECTED]>
        Date: Jun 5, 2005 4:25 AM
        Message-ID: <[EMAIL PROTECTED]>

Affected files ...

... //depot/perl/pp_sort.c#36 edit

Differences ...

==== //depot/perl/pp_sort.c#36 (text) ====
Index: perl/pp_sort.c
--- perl/pp_sort.c#35~24666~    Thu Jun  2 00:39:30 2005
+++ perl/pp_sort.c      Sun Jun  5 04:14:41 2005
@@ -1593,17 +1593,40 @@
        sortsvp = S_sortsv_desc;
     }
 
-    /* shuffle stack down, removing optional initial cv (p1!=p2), plus any
-     * nulls; also stringify any args */
+    /* shuffle stack down, removing optional initial cv (p1!=p2), plus
+     * any nulls; also stringify or converting to integer or number as
+     * required any args */
     for (i=max; i > 0 ; i--) {
        if ((*p1 = *p2++)) {                    /* Weed out nulls. */
            SvTEMP_off(*p1);
-           if (!PL_sortcop && !SvPOK(*p1)) {
-               STRLEN n_a;
-               if (SvAMAGIC(*p1))
-                   overloading = 1;
-               else
-                   (void)sv_2pv(*p1, &n_a);
+           if (!PL_sortcop) {
+               if (priv & OPpSORT_NUMERIC) {
+                   if (priv & OPpSORT_INTEGER) {
+                       if (!SvIOK(*p1)) {
+                           if (SvAMAGIC(*p1))
+                               overloading = 1;
+                           else
+                               (void)sv_2iv(*p1);
+                       }
+                   }
+                   else {
+                       if (!SvNOK(*p1)) {
+                           if (SvAMAGIC(*p1))
+                               overloading = 1;
+                           else
+                               (void)sv_2nv(*p1);
+                       }
+                   }
+               }
+               else {
+                   if (!SvPOK(*p1)) {
+                       STRLEN n_a;
+                       if (SvAMAGIC(*p1))
+                           overloading = 1;
+                       else
+                           (void)sv_2pv(*p1, &n_a);
+                   }
+               }
            }
            p1++;
        }
End of Patch.

Reply via email to