Change 33213 by [EMAIL PROTECTED] on 2008/02/02 21:34:53

        Integrate:
        [ 33137]
        Integrate:
        [ 32763]
        Perl_sv_chop() can return early if it's being asked to do nothing.
        
        [ 32777]
        Move all code that relies on reading the to-be-thrown-away buffer ahead
        of the call to sv_chop() that throws it away.
        
        [ 32781]
        Include SVf_UTF8 in the bitmask when checking the SvFLAGS in
        SvPVutf8_force(), as otherwise the conditional expression will
        always be false and the optimisation will never kick in.
        
        [ 33013]
        In Perl_cx_dup(), block copy the entire context stack, then walk it
        to duplicate/fixup only the things that aren't simple binary copies.
        
        [ 33068]
        Using PL_sv_no in place of any !SvOK() maximum removes a little bit of
        hot code in pp_iter.

Affected files ...

... //depot/maint-5.8/perl/pp_ctl.c#185 integrate
... //depot/maint-5.8/perl/pp_hot.c#143 integrate
... //depot/maint-5.8/perl/sv.c#377 integrate
... //depot/maint-5.8/perl/sv.h#88 integrate

Differences ...

==== //depot/maint-5.8/perl/pp_ctl.c#185 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#184~33202~    2008-02-02 09:56:35.000000000 -0800
+++ perl/pp_ctl.c       2008-02-02 13:34:53.000000000 -0800
@@ -1726,7 +1726,15 @@
            else {
                cx->blk_loop.iterlval = newSVsv(sv);
                (void) SvPV_force_nolen(cx->blk_loop.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.iterary = (AV*) &PL_sv_no;
+               }
            }
        }
        else if (PL_op->op_private & OPpITER_REVERSED) {

==== //depot/maint-5.8/perl/pp_hot.c#143 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#142~33211~    2008-02-02 12:21:10.000000000 -0800
+++ perl/pp_hot.c       2008-02-02 13:34:53.000000000 -0800
@@ -1864,10 +1864,10 @@
        if (cx->blk_loop.iterlval) {
            /* string increment */
            register SV* cur = cx->blk_loop.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) {
 #ifndef USE_5005THREADS                          /* don't risk potential race 
*/
                if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
@@ -2138,10 +2138,8 @@
            else if ((i = m - s)) {     /* faster from front */
                d -= clen;
                m = d;
+               Move(s, d - i, i, char);
                sv_chop(TARG, d-i);
-               s += i;
-               while (i--)
-                   *--d = *--s;
                if (clen)
                    Copy(c, m, clen, char);
            }

==== //depot/maint-5.8/perl/sv.c#377 (text) ====
Index: perl/sv.c
--- perl/sv.c#376~33204~        2008-02-02 10:16:39.000000000 -0800
+++ perl/sv.c   2008-02-02 13:34:53.000000000 -0800
@@ -3809,6 +3809,10 @@
     if (!ptr || !SvPOKp(sv))
        return;
     delta = ptr - SvPVX_const(sv);
+    if (!delta) {
+       /* Nothing to do.  */
+       return;
+    }
     SV_CHECK_THINKFIRST(sv);
     if (SvTYPE(sv) < SVt_PVIV)
        sv_upgrade(sv,SVt_PVIV);
@@ -4484,10 +4488,8 @@
     else if ((i = mid - big)) {        /* faster from front */
        midend -= littlelen;
        mid = midend;
+       Move(big, midend - i, i, char);
        sv_chop(bigstr,midend-i);
-       big += i;
-       while (i--)
-           *--midend = *--big;
        if (littlelen)
            Move(little, mid, littlelen,char);
     }
@@ -9822,69 +9824,55 @@
        return ncxs;
 
     /* create anew and remember what it is */
-    Newxz(ncxs, max + 1, PERL_CONTEXT);
+    Newx(ncxs, max + 1, PERL_CONTEXT);
     ptr_table_store(PL_ptr_table, cxs, ncxs);
+    Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
 
     while (ix >= 0) {
-       PERL_CONTEXT * const cx = &cxs[ix];
        PERL_CONTEXT * const ncx = &ncxs[ix];
-       ncx->cx_type    = cx->cx_type;
-       if (CxTYPE(cx) == CXt_SUBST) {
+       if (CxTYPE(ncx) == CXt_SUBST) {
            Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
        }
        else {
-           ncx->blk_oldsp      = cx->blk_oldsp;
-           ncx->blk_oldcop     = cx->blk_oldcop;
-           ncx->blk_oldretsp   = cx->blk_oldretsp;
-           ncx->blk_oldmarksp  = cx->blk_oldmarksp;
-           ncx->blk_oldscopesp = cx->blk_oldscopesp;
-           ncx->blk_oldpm      = cx->blk_oldpm;
-           ncx->blk_gimme      = cx->blk_gimme;
-           switch (CxTYPE(cx)) {
+           switch (CxTYPE(ncx)) {
            case CXt_SUB:
-               ncx->blk_sub.cv         = (cx->blk_sub.olddepth == 0
-                                          ? cv_dup_inc(cx->blk_sub.cv, param)
-                                          : cv_dup(cx->blk_sub.cv,param));
-               ncx->blk_sub.argarray   = (cx->blk_sub.hasargs
-                                          ? av_dup_inc(cx->blk_sub.argarray, 
param)
+               ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
+                                          ? cv_dup_inc(ncx->blk_sub.cv, param)
+                                          : cv_dup(ncx->blk_sub.cv,param));
+               ncx->blk_sub.argarray   = (ncx->blk_sub.hasargs
+                                          ? av_dup_inc(ncx->blk_sub.argarray,
+                                                       param)
                                           : NULL);
-               ncx->blk_sub.savearray  = av_dup_inc(cx->blk_sub.savearray, 
param);
-               ncx->blk_sub.olddepth   = cx->blk_sub.olddepth;
-               ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
-               ncx->blk_sub.lval       = cx->blk_sub.lval;
+               ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
+                                                    param);
                ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
-                                          cx->blk_sub.oldcomppad);
+                                          ncx->blk_sub.oldcomppad);
                break;
            case CXt_EVAL:
-               ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
-               ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
-               ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, 
param);
-               ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
-               ncx->blk_eval.cur_text  = sv_dup(cx->blk_eval.cur_text, param);
+               ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
+                                                     param);
+               ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
                break;
            case CXt_LOOP:
-               ncx->blk_loop.label     = cx->blk_loop.label;
-               ncx->blk_loop.resetsp   = cx->blk_loop.resetsp;
-               ncx->blk_loop.redo_op   = cx->blk_loop.redo_op;
-               ncx->blk_loop.next_op   = cx->blk_loop.next_op;
-               ncx->blk_loop.last_op   = cx->blk_loop.last_op;
-               ncx->blk_loop.iterdata  = (CxPADLOOP(cx)
-                                          ? cx->blk_loop.iterdata
-                                          : gv_dup((GV*)cx->blk_loop.iterdata, 
param));
+               ncx->blk_loop.iterdata  = (CxPADLOOP(ncx)
+                                          ? ncx->blk_loop.iterdata
+                                          : gv_dup((GV*)ncx->blk_loop.iterdata,
+                                                   param));
                ncx->blk_loop.oldcomppad
                    = (PAD*)ptr_table_fetch(PL_ptr_table,
-                                           cx->blk_loop.oldcomppad);
-               ncx->blk_loop.itersave  = sv_dup_inc(cx->blk_loop.itersave, 
param);
-               ncx->blk_loop.iterlval  = sv_dup_inc(cx->blk_loop.iterlval, 
param);
-               ncx->blk_loop.iterary   = av_dup_inc(cx->blk_loop.iterary, 
param);
-               ncx->blk_loop.iterix    = cx->blk_loop.iterix;
-               ncx->blk_loop.itermax   = cx->blk_loop.itermax;
+                                           ncx->blk_loop.oldcomppad);
+               ncx->blk_loop.itersave  = sv_dup_inc(ncx->blk_loop.itersave,
+                                                    param);
+               ncx->blk_loop.iterlval  = sv_dup_inc(ncx->blk_loop.iterlval,
+                                                    param);
+               ncx->blk_loop.iterary   = av_dup_inc(ncx->blk_loop.iterary,
+                                                    param);
                break;
            case CXt_FORMAT:
-               ncx->blk_sub.cv         = cv_dup(cx->blk_sub.cv, param);
-               ncx->blk_sub.gv         = gv_dup(cx->blk_sub.gv, param);
-               ncx->blk_sub.dfoutgv    = gv_dup_inc(cx->blk_sub.dfoutgv, 
param);
-               ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
+               ncx->blk_sub.cv         = cv_dup(ncx->blk_sub.cv, param);
+               ncx->blk_sub.gv         = gv_dup(ncx->blk_sub.gv, param);
+               ncx->blk_sub.dfoutgv    = gv_dup_inc(ncx->blk_sub.dfoutgv,
+                                                    param);
                break;
            case CXt_BLOCK:
            case CXt_NULL:

==== //depot/maint-5.8/perl/sv.h#88 (text) ====
Index: perl/sv.h
--- perl/sv.h#87~33204~ 2008-02-02 10:16:39.000000000 -0800
+++ perl/sv.h   2008-02-02 13:34:53.000000000 -0800
@@ -1305,7 +1305,7 @@
      ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp))
 
 #define SvPVutf8_force(sv, lp) \
-    ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
+    ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
      ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp))
 
 
End of Patch.

Reply via email to