summaryrefslogtreecommitdiff
path: root/pp_ctl.c
diff options
context:
space:
mode:
authorJerry D. Hedden <jdhedden@cpan.org>2008-01-14 14:56:48 -0500
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2008-01-15 11:11:07 +0000
commita2309040b8fe324ae09c064137c624b4292d93c1 (patch)
tree94472c2597f4c1ce4778668ea9af0743628a3a89 /pp_ctl.c
parent3e946625bd318900adc25217434a05ce37064aba (diff)
downloadperl-a2309040b8fe324ae09c064137c624b4292d93c1.tar.gz
Fix range operator
From: "Jerry D. Hedden" <jdhedden@cpan.org> Message-ID: <1ff86f510801141656i325ac69ev8a0af47f9fe72a1e@mail.gmail.com> p4raw-id: //depot/perl@32979
Diffstat (limited to 'pp_ctl.c')
-rw-r--r--pp_ctl.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index 5cc002c603..c596fdba15 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1873,8 +1873,25 @@ PP(pp_enteriter)
SvGETMAGIC(sv);
SvGETMAGIC(right);
if (RANGE_IS_NUMERIC(sv,right)) {
- if ((SvOK(sv) && SvNV(sv) < IV_MIN) ||
- (SvOK(right) && SvNV(right) >= IV_MAX))
+#ifdef NV_PRESERVES_UV
+ if ((SvOK(sv) && ((SvNV(sv) < (NV)IV_MIN) ||
+ (SvNV(sv) > (NV)IV_MAX)))
+ ||
+ (SvOK(right) && ((SvNV(right) > (NV)IV_MAX) ||
+ (SvNV(right) < (NV)IV_MIN))))
+#else
+ if ((SvOK(sv) && ((SvNV(sv) <= (NV)IV_MIN)
+ ||
+ ((SvNV(sv) > 0) &&
+ ((SvUV(sv) > (UV)IV_MAX) ||
+ (SvNV(sv) > (NV)UV_MAX)))))
+ ||
+ (SvOK(right) && ((SvNV(right) <= (NV)IV_MIN)
+ ||
+ ((SvNV(right) > 0) &&
+ ((SvUV(right) > (UV)IV_MAX) ||
+ (SvNV(right) > (NV)UV_MAX))))))
+#endif
DIE(aTHX_ "Range iterator outside integer range");
cx->blk_loop.iterix = SvIV(sv);
cx->blk_loop.itermax = SvIV(right);