Change 27379 by [EMAIL PROTECTED] on 2006/03/05 17:47:23

        Use a HEK to store the GV's name, rather than a malloc()ed string.
        Saves 1 word in each GV (no more strlen), and will also save the memory
        used by the string itself, as the HEK will exist already due to the
        key used by the symbol table for this GV.

Affected files ...

... //depot/perl/gv.c#308 edit
... //depot/perl/gv.h#60 edit
... //depot/perl/sv.c#1181 edit
... //depot/perl/sv.h#265 edit

Differences ...

==== //depot/perl/gv.c#308 (text) ====
Index: perl/gv.c
--- perl/gv.c#307~27377~        2006-03-05 03:53:55.000000000 -0800
+++ perl/gv.c   2006-03-05 09:47:23.000000000 -0800
@@ -2107,11 +2107,15 @@
 Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
 {
     dVAR;
+    U32 hash;
 
     PERL_UNUSED_ARG(flags);
 
-    GvXPVGV(gv)->xgv_name = name ? savepvn(name, len) : NULL;
-    GvXPVGV(gv)->xgv_namelen = len;
+    if (len > I32_MAX)
+       Perl_croak(aTHX_ "panic: gv name too long (%"UVuf")", (UV) len);
+
+    PERL_HASH(hash, name, len);
+    GvXPVGV(gv)->xgv_namehek = name ? share_hek(name, len, hash) : 0;
 }
 
 /*

==== //depot/perl/gv.h#60 (text) ====
Index: perl/gv.h
--- perl/gv.h#59~27377~ 2006-03-05 03:53:55.000000000 -0800
+++ perl/gv.h   2006-03-05 09:47:23.000000000 -0800
@@ -43,26 +43,22 @@
            assert(SvTYPE(_gv) == SVt_PVGV || SvTYPE(_gv) >= SVt_PVLV); \
            &(GvXPVGV(_gv)->xnv_u.xgv_stash);                           \
         }))
-#  define GvNAME_get(gv)                                               \
-       ({ GV * const zzzz = (GV *) (gv);                               \
+#  define GvNAME_HEK(gv)                                               \
+       (*({ GV * const zzzz = (GV *) (gv);                             \
           assert(isGV_with_GP(zzzz));                                  \
           assert(SvTYPE(zzzz) == SVt_PVGV || SvTYPE(zzzz) >= SVt_PVLV); \
-          0 + (GvXPVGV(zzzz)->xgv_name);                               \
-        })
-#  define GvNAMELEN_get(gv)                                            \
-       ({ GV * const glank = (GV *) (gv);                              \
-          assert(isGV_with_GP(glank));                         \
-          assert(SvTYPE(glank) == SVt_PVGV || SvTYPE(glank) >= SVt_PVLV); \
-          0 + (GvXPVGV(glank)->xgv_namelen);                           \
-        })
+          &(GvXPVGV(zzzz)->xgv_namehek);                               \
+        }))
 #else
 #  define GvGP(gv)     ((gv)->sv_u.svu_gp)
 #  define GvFLAGS(gv)  (GvXPVGV(gv)->xpv_cur)
 #  define GvSTASH(gv)  (GvXPVGV(gv)->xnv_u.xgv_stash)
-#  define GvNAME_get(gv)       (0 + GvXPVGV(gv)->xgv_name)
-#  define GvNAMELEN_get(gv)    (0 + GvXPVGV(gv)->xgv_namelen)
+#  define GvNAME_HEK(gv)       (GvXPVGV(gv)->xgv_namehek)
 #endif
 
+#define GvNAME_get(gv)         (GvNAME_HEK(gv) ? HEK_KEY(GvNAME_HEK(gv)) : 0)
+#define GvNAMELEN_get(gv)      (GvNAME_HEK(gv) ? HEK_LEN(GvNAME_HEK(gv)) : 0)
+
 #define GvNAME(gv)     GvNAME_get(gv)
 #define GvNAMELEN(gv)  GvNAMELEN_get(gv)
 

==== //depot/perl/sv.c#1181 (text) ====
Index: perl/sv.c
--- perl/sv.c#1180~27377~       2006-03-05 03:53:55.000000000 -0800
+++ perl/sv.c   2006-03-05 09:47:23.000000000 -0800
@@ -3216,7 +3216,7 @@
        GvSTASH(dstr) = GvSTASH(sstr);
        if (GvSTASH(dstr))
            Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
-       gv_name_set(dstr, name, len, 0);
+       gv_name_set((GV *)dstr, name, len, 0);
        SvFAKE_on(dstr);        /* can coerce to non-glob */
     }
 
@@ -5111,7 +5111,9 @@
        goto freescalar;
     case SVt_PVGV:
        gp_free((GV*)sv);
-       Safefree(GvNAME(sv));
+       if (GvNAME_HEK(sv)) {
+           unshare_hek(GvNAME_HEK(sv));
+       }
        /* If we're in a stash, we don't own a reference to it. However it does
           have a back reference to us, which needs to be cleared.  */
        if (GvSTASH(sv))
@@ -7715,7 +7717,9 @@
        GvSTASH(sv) = NULL;
     }
     GvMULTI_off(sv);
-    Safefree(GvNAME(sv));
+    if (GvNAME_HEK(sv)) {
+       unshare_hek(GvNAME_HEK(sv));
+    }
     SvSCREAM_off(sv);
 
     /* need to keep SvANY(sv) in the right arena */
@@ -9836,7 +9840,8 @@
                    LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
                break;
            case SVt_PVGV:
-               GvXPVGV(dstr)->xgv_name = SAVEPVN(GvNAME(dstr), 
GvNAMELEN(dstr));
+               if (GvNAME_HEK(dstr))
+                   GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
 
                /* Don't call sv_add_backref here as it's going to be created
                   as part of the magic cloning of the symbol table.  */

==== //depot/perl/sv.h#265 (text) ====
Index: perl/sv.h
--- perl/sv.h#264~27348~        2006-02-27 09:48:55.000000000 -0800
+++ perl/sv.h   2006-03-05 09:47:23.000000000 -0800
@@ -487,8 +487,7 @@
     HV*                xmg_stash;      /* class package */
 
     /* a full glob fits into this */
-    char*      xgv_name;
-    STRLEN     xgv_namelen;
+    HEK *      xgv_namehek;
 
     STRLEN     xlv_targoff;
     STRLEN     xlv_targlen;
@@ -516,8 +515,7 @@
     } xmg_u;
     HV*                xmg_stash;      /* class package */
 
-    char*      xgv_name;
-    STRLEN     xgv_namelen;
+    HEK *      xgv_namehek;
 };
 
 struct xpvbm {
End of Patch.

Reply via email to