From: Hugo van der Sanden Date: Sun, 2 May 1999 17:02:53 +0000 (+0100) Subject: better range-checking on list slices, with test X-Git-Tag: accepted/trunk/20130322.191538~36440 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c73bf8e3ece265b261438c8090fb5ecbf0977587;p=platform%2Fupstream%2Fperl.git better range-checking on list slices, with test Message-Id: <199905021602.RAA13905@crypt.compulink.co.uk> Subject: Re: List slice of undefs returns 0 items p4raw-id: //depot/perl@3406 --- diff --git a/pp.c b/pp.c index 431dc9a..e76266e 100644 --- a/pp.c +++ b/pp.c @@ -2827,20 +2827,17 @@ PP(pp_lslice) for (lelem = firstlelem; lelem <= lastlelem; lelem++) { ix = SvIVx(*lelem); - if (ix < 0) { + if (ix < 0) ix += max; - if (ix < 0) - *lelem = &PL_sv_undef; - else if (!(*lelem = firstrelem[ix])) - *lelem = &PL_sv_undef; - } - else { + else ix -= arybase; - if (ix >= max || !(*lelem = firstrelem[ix])) + if (ix < 0 || ix >= max) + *lelem = &PL_sv_undef; + else { + is_something_there = TRUE; + if (!(*lelem = firstrelem[ix])) *lelem = &PL_sv_undef; } - if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem))) - is_something_there = TRUE; } if (is_something_there) SP = lastlelem; diff --git a/t/op/list.t b/t/op/list.t index a4230b6..4d7a2d5 100755 --- a/t/op/list.t +++ b/t/op/list.t @@ -1,8 +1,6 @@ #!./perl -# $RCSfile: list.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:02 $ - -print "1..27\n"; +print "1..28\n"; @foo = (1, 2, 3, 4); if ($foo[0] == 1 && $foo[3] == 4) {print "ok 1\n";} else {print "not ok 1\n";} @@ -81,3 +79,11 @@ for ($x = 0; $x < 3; $x++) { print $a,$b,$c; } +# slices +{ + my @a = (0, undef, undef, 3); + my @b = @a[1,2]; + my @c = (0, undef, undef, 3)[1, 2]; + print "not " unless @b == @c and @c == 2; + print "ok 28\n"; +}