From: Nicholas Clark Date: Fri, 25 Jan 2008 10:06:08 +0000 (+0000) Subject: Using PL_sv_no in place of any !SvOK() maximum removes a little bit of X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=267cc4a8114e05742ba94bb40aa5728a5cfaa166;p=p5sagit%2Fp5-mst-13.2.git Using PL_sv_no in place of any !SvOK() maximum removes a little bit of hot code in pp_iter. p4raw-id: //depot/perl@33068 --- diff --git a/pp_ctl.c b/pp_ctl.c index 67f450c..1e4b1e9 100644 --- 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) { diff --git a/pp_hot.c b/pp_hot.c index 4e55f26..4e28a12 100644 --- 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 */