Using PL_sv_no in place of any !SvOK() maximum removes a little bit of
Nicholas Clark [Fri, 25 Jan 2008 10:06:08 +0000 (10:06 +0000)]
hot code in pp_iter.

p4raw-id: //depot/perl@33068

pp_ctl.c
pp_hot.c

index 67f450c..1e4b1e9 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1922,7 +1922,15 @@ PP(pp_enteriter)
            else {
                cx->blk_loop.lval_max_u.iterlval = newSVsv(sv);
                (void) SvPV_force_nolen(cx->blk_loop.lval_max_u.iterlval);
+               /* This will do the upgrade to SVt_PV, and warn if the value
+                  is uninitialised.  */
                (void) SvPV_nolen_const(right);
+               /* Doing this avoids a check every time in pp_iter in pp_hot.c
+                  to replace !SvOK() with a pointer to "".  */
+               if (!SvOK(right)) {
+                   SvREFCNT_dec(right);
+                   cx->blk_loop.ary_min_u.iterary = (AV*) &PL_sv_no;
+               }
            }
        }
        else if (PL_op->op_private & OPpITER_REVERSED) {
index 4e55f26..4e28a12 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1918,10 +1918,10 @@ PP(pp_iter)
        if (CxTYPE(cx) != CXt_LOOP_LAZYIV) {
            /* string increment */
            register SV* cur = cx->blk_loop.lval_max_u.iterlval;
+           /* If the maximum is !SvOK(), pp_enteriter substitutes PL_sv_no.
+              It has SvPVX of "" and SvCUR of 0, which is what we want.  */
            STRLEN maxlen = 0;
-           const char *max =
-             SvOK((SV*)av) ?
-             SvPV_const((SV*)av, maxlen) : (const char *)"";
+           const char *max = SvPV_const((SV*)av, maxlen);
            if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
                if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
                    /* safe to reuse old SV */