From: Jarkko Hietaniemi Date: Sun, 18 Nov 2001 17:07:12 +0000 (+0000) Subject: Retract 11635: close 20011113.110, reopen 20010809.028. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=976c8a39d49b217cde66f5408b0c0e7431507598;p=p5sagit%2Fp5-mst-13.2.git Retract 11635: close 20011113.110, reopen 20010809.028. 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 --- diff --git a/pp.c b/pp.c index d6d0534..9407fd4 100644 --- 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++; diff --git a/t/op/repeat.t b/t/op/repeat.t index ef462cb..82fcf75 100755 --- a/t/op/repeat.t +++ b/t/op/repeat.t @@ -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'); +} +