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.