Change 25394 by [EMAIL PROTECTED] on 2005/09/12 21:21:39

        Integrate:
        [ 24348]
        Add a new macro SvPV_free() which undoes OOK and free()s the PVX(),
        becase there's a lot of code around that calls SvOOK_off(), memmov()s
        the buffer, then promptly free()s it. So avoid the needless memmov().
        
        [ 24351]
        Refactor Perl_sv_utf8_upgrade_flags to use SvPV_free

Affected files ...

... //depot/maint-5.8/perl/perl.c#104 integrate
... //depot/maint-5.8/perl/pp.c#56 integrate
... //depot/maint-5.8/perl/pp_ctl.c#70 integrate
... //depot/maint-5.8/perl/pp_hot.c#60 integrate
... //depot/maint-5.8/perl/sv.c#136 integrate
... //depot/maint-5.8/perl/sv.h#37 integrate

Differences ...

==== //depot/maint-5.8/perl/perl.c#104 (text) ====
Index: perl/perl.c
--- perl/perl.c#103~25390~      Mon Sep 12 09:18:42 2005
+++ perl/perl.c Mon Sep 12 14:21:39 2005
@@ -1062,8 +1062,7 @@
        }
 
        /* we know that type >= SVt_PV */
-       SvOOK_off(PL_mess_sv);
-       Safefree(SvPVX(PL_mess_sv));
+       SvPV_free(PL_mess_sv);
        Safefree(SvANY(PL_mess_sv));
        Safefree(PL_mess_sv);
        PL_mess_sv = Nullsv;

==== //depot/maint-5.8/perl/pp.c#56 (text) ====
Index: perl/pp.c
--- perl/pp.c#55~25391~ Mon Sep 12 12:50:36 2005
+++ perl/pp.c   Mon Sep 12 14:21:39 2005
@@ -178,9 +178,7 @@
                    if (SvTYPE(sv) < SVt_RV)
                        sv_upgrade(sv, SVt_RV);
                    if (SvPVX(sv)) {
-                       SvOOK_off(sv);          /* backoff */
-                       if (SvLEN(sv))
-                           Safefree(SvPVX(sv));
+                       SvPV_free(sv);
                        SvLEN_set(sv, 0);
                         SvCUR_set(sv, 0);
                    }
@@ -831,8 +829,7 @@
        break;
     default:
        if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
-           SvOOK_off(sv);
-           Safefree(SvPVX(sv));
+           SvPV_free(sv);
            SvPV_set(sv, Nullch);
            SvLEN_set(sv, 0);
        }

==== //depot/maint-5.8/perl/pp_ctl.c#70 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#69~25390~     Mon Sep 12 09:18:42 2005
+++ perl/pp_ctl.c       Mon Sep 12 14:21:39 2005
@@ -207,9 +207,7 @@
            }
            cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
 
-           SvOOK_off(targ);
-           if (SvLEN(targ))
-               Safefree(SvPVX(targ));
+           SvPV_free(targ);
            SvPV_set(targ, SvPVX(dstr));
            SvCUR_set(targ, SvCUR(dstr));
            SvLEN_set(targ, SvLEN(dstr));

==== //depot/maint-5.8/perl/pp_hot.c#60 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#59~25391~     Mon Sep 12 12:50:36 2005
+++ perl/pp_hot.c       Mon Sep 12 14:21:39 2005
@@ -2262,9 +2262,7 @@
        else
            sv_catpvn(dstr, s, strend - s);
 
-       SvOOK_off(TARG);
-       if (SvLEN(TARG))
-           Safefree(SvPVX(TARG));
+       SvPV_free(TARG);
        SvPV_set(TARG, SvPVX(dstr));
        SvCUR_set(TARG, SvCUR(dstr));
        SvLEN_set(TARG, SvLEN(dstr));
@@ -3076,8 +3074,7 @@
        if (SvTYPE(sv) < SVt_RV)
            sv_upgrade(sv, SVt_RV);
        else if (SvTYPE(sv) >= SVt_PV) {
-           SvOOK_off(sv);
-           Safefree(SvPVX(sv));
+           SvPV_free(sv);
             SvLEN_set(sv, 0);
            SvCUR_set(sv, 0);
        }

==== //depot/maint-5.8/perl/sv.c#136 (text) ====
Index: perl/sv.c
--- perl/sv.c#135~25391~        Mon Sep 12 12:50:36 2005
+++ perl/sv.c   Mon Sep 12 14:21:39 2005
@@ -3435,9 +3435,6 @@
 STRLEN
 Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
 {
-    U8 *s, *t, *e;
-    int  hibit = 0;
-
     if (sv == &PL_sv_undef)
        return 0;
     if (!SvPOK(sv)) {
@@ -3462,31 +3459,32 @@
     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
         sv_recode_to_utf8(sv, PL_encoding);
     else { /* Assume Latin-1/EBCDIC */
-        /* This function could be much more efficient if we
-         * had a FLAG in SVs to signal if there are any hibit
-         * chars in the PV.  Given that there isn't such a flag
-         * make the loop as fast as possible. */
-        s = (U8 *) SvPVX(sv);
-        e = (U8 *) SvEND(sv);
-        t = s;
-        while (t < e) {
-             U8 ch = *t++;
-             if ((hibit = !NATIVE_IS_INVARIANT(ch)))
-                  break;
-        }
-        if (hibit) {
-             STRLEN len;
-             (void)SvOOK_off(sv);
-             s = (U8*)SvPVX(sv);
-             len = SvCUR(sv) + 1; /* Plus the \0 */
-             SvPV_set(sv, (char*)bytes_to_utf8((U8*)s, &len));
-             SvCUR_set(sv, len - 1);
-             if (SvLEN(sv) != 0)
-                  Safefree(s); /* No longer using what was there before. */
-             SvLEN_set(sv, len); /* No longer know the real size. */
-        }
-        /* Mark as UTF-8 even if no hibit - saves scanning loop */
-        SvUTF8_on(sv);
+       /* This function could be much more efficient if we
+        * had a FLAG in SVs to signal if there are any hibit
+        * chars in the PV.  Given that there isn't such a flag
+        * make the loop as fast as possible. */
+       U8 *s = (U8 *) SvPVX(sv);
+       U8 *e = (U8 *) SvEND(sv);
+       U8 *t = s;
+       int hibit = 0;
+       
+       while (t < e) {
+           U8 ch = *t++;
+           if ((hibit = !NATIVE_IS_INVARIANT(ch)))
+               break;
+       }
+       if (hibit) {
+           STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
+           s = bytes_to_utf8((U8*)s, &len);
+
+           SvPV_free(sv); /* No longer using what was there before. */
+
+           SvPV_set(sv, (char*)s);
+           SvCUR_set(sv, len - 1);
+           SvLEN_set(sv, len); /* No longer know the real size. */
+       }
+       /* Mark as UTF-8 even if no hibit - saves scanning loop */
+       SvUTF8_on(sv);
     }
     return SvCUR(sv);
 }
@@ -3956,16 +3954,7 @@
                return;
            }
            if (SvPVX(dstr)) {
-               if (SvLEN(dstr)) {
-                   /* Unwrap the OOK offset by hand, to save a needless
-                      memmove on memory that's about to be free()d.  */
-                   char *pv = SvPVX(dstr);
-                   if (SvOOK(dstr)) {
-                       pv -= SvIVX(dstr);
-                       SvFLAGS(dstr) &= ~SVf_OOK;
-                   }
-                   Safefree(pv);
-               }
+               SvPV_free(dstr);
                SvLEN_set(dstr, 0);
                 SvCUR_set(dstr, 0);
            }
@@ -4235,9 +4224,8 @@
        (void)SvOK_off(sv);
        return;
     }
-    (void)SvOOK_off(sv);
-    if (SvPVX(sv) && SvLEN(sv))
-       Safefree(SvPVX(sv));
+    if (SvPVX(sv))
+       SvPV_free(sv);
     Renew(ptr, len+1, char);
     SvPV_set(sv, ptr);
     SvCUR_set(sv, len);
@@ -7738,9 +7726,7 @@
     if (SvTYPE(rv) < SVt_RV)
        sv_upgrade(rv, SVt_RV);
     else if (SvTYPE(rv) > SVt_RV) {
-       SvOOK_off(rv);
-       if (SvPVX(rv) && SvLEN(rv))
-           Safefree(SvPVX(rv));
+       SvPV_free(rv);
        SvCUR_set(rv, 0);
        SvLEN_set(rv, 0);
     }

==== //depot/maint-5.8/perl/sv.h#37 (text) ====
Index: perl/sv.h
--- perl/sv.h#36~25391~ Mon Sep 12 12:50:36 2005
+++ perl/sv.h   Mon Sep 12 14:21:39 2005
@@ -801,6 +801,18 @@
        STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
                (SvCUR(sv) = (val) - SvPVX(sv)); } STMT_END
 
+#define SvPV_free(sv) \
+       STMT_START { assert(SvTYPE(sv) >= SVt_PV);      \
+               if (SvLEN(sv)) {                        \
+                   if(SvOOK(sv)) {                     \
+                     Safefree(SvPVX(sv) - SvIVX(sv));  \
+                     SvFLAGS(sv) &= ~SVf_OOK;          \
+                   } else {                            \
+                     Safefree(SvPVX(sv));              \
+                   }                                   \
+               }                                       \
+       } STMT_END
+
 #define BmRARE(sv)     ((XPVBM*)  SvANY(sv))->xbm_rare
 #define BmUSEFUL(sv)   ((XPVBM*)  SvANY(sv))->xbm_useful
 #define BmPREVIOUS(sv) ((XPVBM*)  SvANY(sv))->xbm_previous
End of Patch.

Reply via email to