From: Marcus Holland-Moritz Date: Sun, 7 Mar 2004 21:11:20 +0000 (+0100) Subject: undef and the range operator X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=076d9a11d18d650bf0992032a42c6e83fb1c2ea6;p=p5sagit%2Fp5-mst-13.2.git undef and the range operator Message-Id: <20040307211120.10e46933@r2d2> p4raw-id: //depot/perl@22462 --- diff --git a/pp_ctl.c b/pp_ctl.c index fd98698..038129f 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -1056,11 +1056,10 @@ PP(pp_flip) an exception for .."0" [#18165]). AMS 20021031. */ #define RANGE_IS_NUMERIC(left,right) ( \ - (!SvOK(left) && !SvOK(right)) || \ SvNIOKp(left) || (SvOK(left) && !SvPOKp(left)) || \ SvNIOKp(right) || (SvOK(right) && !SvPOKp(right)) || \ - (looks_like_number(left) && SvPOKp(left) && *SvPVX(left) != '0' && \ - looks_like_number(right))) + (((!SvOK(left) && SvOK(right)) || (looks_like_number(left) && \ + SvPOKp(left) && *SvPVX(left) != '0')) && looks_like_number(right))) PP(pp_flop) { @@ -1792,11 +1791,11 @@ PP(pp_enteriter) if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) { dPOPss; if (RANGE_IS_NUMERIC(sv,(SV*)cx->blk_loop.iterary)) { - if (SvNV(sv) < IV_MIN || - SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX) - DIE(aTHX_ "Range iterator outside integer range"); - cx->blk_loop.iterix = SvIV(sv); - cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary); + if (SvNV(sv) < IV_MIN || + SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX) + DIE(aTHX_ "Range iterator outside integer range"); + cx->blk_loop.iterix = SvIV(sv); + cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary); } else { STRLEN n_a; diff --git a/t/op/range.t b/t/op/range.t index d92be7a..cdc494c 100755 --- a/t/op/range.t +++ b/t/op/range.t @@ -1,6 +1,6 @@ #!./perl -print "1..30\n"; +print "1..34\n"; print join(':',1..5) eq '1:2:3:4:5' ? "ok 1\n" : "not ok 1\n"; @@ -83,25 +83,33 @@ print join(":","-4\n".."-0\n") eq "-4:-3:-2:-1:0" ? "ok 19\n" : "not ok 19\n"; # undef should be treated as 0 for numerical range print join(":",undef..2) eq '0:1:2' ? "ok 20\n" : "not ok 20\n"; print join(":",-2..undef) eq '-2:-1:0' ? "ok 21\n" : "not ok 21\n"; +print join(":",undef..'2') eq '0:1:2' ? "ok 22\n" : "not ok 22\n"; +print join(":",'-2'..undef) eq '-2:-1:0' ? "ok 23\n" : "not ok 23\n"; # undef should be treated as "" for magical range -print join(":","".."B") eq '' ? "ok 22\n" : "not ok 22\n"; -print join(":",undef.."B") eq '' ? "ok 23\n" : "not ok 23\n"; -print join(":","B".."") eq '' ? "ok 24\n" : "not ok 24\n"; -print join(":","B"..undef) eq '' ? "ok 25\n" : "not ok 25\n"; +print join(":","".."B") eq '' ? "ok 24\n" : "not ok 24\n"; +print join(":",undef.."B") eq '' ? "ok 25\n" : "not ok 25\n"; +print join(":","B".."") eq '' ? "ok 26\n" : "not ok 26\n"; +print join(":","B"..undef) eq '' ? "ok 27\n" : "not ok 27\n"; -# undef..undef used to segfault and should be 0..0 -print join(":",undef..undef) eq '0' ? "ok 26\n" : "not ok 26\n"; +# undef..undef used to segfault +print join(":",undef..undef) eq '' ? "ok 28\n" : "not ok 28\n"; # also test undef in foreach loops @foo=(); push @foo, $_ for undef..2; -print join(":",@foo) eq '0:1:2' ? "ok 27\n" : "not ok 27\n"; +print join(":",@foo) eq '0:1:2' ? "ok 29\n" : "not ok 29\n"; @foo=(); push @foo, $_ for -2..undef; -print join(":",@foo) eq '-2:-1:0' ? "ok 28\n" : "not ok 28\n"; +print join(":",@foo) eq '-2:-1:0' ? "ok 30\n" : "not ok 30\n"; + +@foo=(); push @foo, $_ for undef..'2'; +print join(":",@foo) eq '0:1:2' ? "ok 31\n" : "not ok 31\n"; + +@foo=(); push @foo, $_ for '-2'..undef; +print join(":",@foo) eq '-2:-1:0' ? "ok 32\n" : "not ok 32\n"; @foo=(); push @foo, $_ for undef.."B"; -print join(":",@foo) eq '' ? "ok 29\n" : "not ok 29\n"; +print join(":",@foo) eq '' ? "ok 33\n" : "not ok 33\n"; @foo=(); push @foo, $_ for "B"..undef; -print join(":",@foo) eq '' ? "ok 30\n" : "not ok 30\n"; +print join(":",@foo) eq '' ? "ok 34\n" : "not ok 34\n";