summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Holland-Moritz <mhx-perl@gmx.net>2004-03-07 22:11:20 +0100
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2004-03-07 20:34:05 +0000
commitfc204a5652cce9cfeb330ef5a0bfa1a7d7c70aee (patch)
tree5d0ce10e8b8d41dc8d45e20564b9caaa4c0575ba
parent79a5efdc72e3410cb83ae730788a8b14d39f62ac (diff)
downloadperl-fc204a5652cce9cfeb330ef5a0bfa1a7d7c70aee.tar.gz
undef and the range operator
Message-Id: <20040307211120.10e46933@r2d2> p4raw-id: //depot/perl@22462
-rw-r--r--pp_ctl.c15
-rwxr-xr-xt/op/range.t30
2 files changed, 26 insertions, 19 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index fd98698121..038129feaa 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 d92be7adb1..cdc494c4ea 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";