Retract 11635: close 20011113.110, reopen 20010809.028.
authorJarkko Hietaniemi <jhi@iki.fi>
Sun, 18 Nov 2001 17:07:12 +0000 (17:07 +0000)
committerJarkko Hietaniemi <jhi@iki.fi>
Sun, 18 Nov 2001 17:07:12 +0000 (17:07 +0000)
Tiny problem in the test for 20011113.110: I hope
'my $x= [("foo") x 1]' was never going to produce [qw(foo foo)] :-)

p4raw-id: //depot/perl@13077

pp.c
t/op/repeat.t

diff --git a/pp.c b/pp.c
index d6d0534817dcdc4f1d12194fbefc83b68b53e04a..9407fd47cd3a2c63f8180d98533612c0ec59fb33 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -1256,10 +1256,33 @@ PP(pp_repeat)
        MEXTEND(MARK, max);
        if (count > 1) {
            while (SP > MARK) {
+#if 0
+             /* This code was intended to fix 20010809.028:
+
+                $x = 'abcd';
+                for (($x =~ /./g) x 2) {
+                    print chop; # "abcdabcd" expected as output.
+                }
+
+              * but that change (#11635) broke this code:
+
+              $x = [("foo")x2]; # only one "foo" ended up in the anonlist.
+
+              * I can't think of a better fix that doesn't introduce
+              * an efficiency hit by copying the SVs. The stack isn't
+              * refcounted, and mortalisation obviously doesn't
+              * Do The Right Thing when the stack has more than
+              * one pointer to the same mortal value.
+              * .robin.
+              */
                if (*SP) {
                    *SP = sv_2mortal(newSVsv(*SP));
                    SvREADONLY_on(*SP);
                }
+#else
+               if (*SP)
+                  SvTEMP_off((*SP));
+#endif
                SP--;
            }
            MARK++;
index ef462cb76e59a4bceb8140efe458aa9d1a7ed896..82fcf75bd2fcd5ab3e09fc4bb9f79821db1782ce 100755 (executable)
@@ -6,7 +6,7 @@ BEGIN {
 }
 
 require './test.pl';
-plan(tests => 24);
+plan(tests => 25);
 
 # compile time
 
@@ -118,7 +118,18 @@ is(77, scalar ((1,7)x2),    'stack truncation');
 
 # perlbug 20011113.110 works in 5.6.1, broken in 5.7.2
 {
-    local $TODO = 'list repeat in anon array ref broken [ID 20011113.110]';
-    my $x= [("foo") x 1];
-    is( join('', @$x), 'foofoo' );
+    my $x= [("foo") x 2];
+    is( join('', @$x), 'foofoo', 'list repeat in anon array ref broken [ID 20011113.110]' );
 }
+
+# [ID 20010809.028] x operator not copying elements in 'for' list?
+{
+    local $TODO = "x operator not copying elements in 'for' list? [ID 20010809.028]";
+    my $x = 'abcd';
+    my $y = '';
+    for (($x =~ /./g) x 2) {
+       $y .= chop;
+    }
+    is($y, 'abcdabcd');
+}
+