This patch fixes the following:

perl -le "print 1x1e12 ne '' ? 'ok' : 'not ok'"
not ok

perl -le "print 1x(1x12) ne '' ? 'ok' : 'not ok'"
not ok

perl -le "print +(1)x1e12"
(no output)

perl -le "print +(1)x(1x12)"
(no output)

diff -ruN perl-current/pp.c perl-patched/pp.c
--- perl-current/pp.c   Wed Jun 22 14:23:34 2005
+++ perl-patched/pp.c   Thu Jun 23 12:14:04 2005
@@ -1399,30 +1399,12 @@
     dPOPss;
     if (SvGMAGICAL(sv))
         mg_get(sv);
-    if (SvIOKp(sv)) {
-        if (SvUOK(sv)) {
-             UV uv = SvUV(sv);
-             if (uv > IV_MAX)
-                  count = IV_MAX; /* The best we can do? */
-             else
-                  count = uv;
-        } else {
-             IV iv = SvIV(sv);
-             if (iv < 0)
-                  count = 0;
-             else
-                  count = iv;
-        }
-    }
-    else if (SvNOKp(sv)) {
-        NV nv = SvNV(sv);
-        if (nv < 0.0)
-             count = 0;
-        else
-             count = (IV)nv;
-    }
-    else
-        count = SvIVx(sv);
+
+    SvIV_please(sv);
+    count = SvIVX(sv);
+    if (SvIsUV(sv) && count < 0)
+       count = IV_MAX;
+
     if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
        dMARK;
        I32 items = SP - MARK;

Reply via email to