Change 29926 by [EMAIL PROTECTED] on 2007/01/22 22:47:32

        Integrate:
        [ 27377]
        Provide Perl_gv_name_set to replace LVALUE use of GvNAME and GvNAMESET.
        
        [ 27382]
        Perl_gv_name_set should not leak the old HEK. Allow the flag GV_ADD
        to simplify GV initialisation.

Affected files ...

... //depot/maint-5.8/perl/embed.fnc#180 integrate
... //depot/maint-5.8/perl/embed.h#135 integrate
... //depot/maint-5.8/perl/global.sym#51 integrate
... //depot/maint-5.8/perl/gv.c#87 integrate
... //depot/maint-5.8/perl/gv.h#19 integrate
... //depot/maint-5.8/perl/proto.h#169 edit
... //depot/maint-5.8/perl/sv.c#303 integrate

Differences ...

==== //depot/maint-5.8/perl/embed.fnc#180 (text) ====
Index: perl/embed.fnc
--- perl/embed.fnc#179~29925~   2007-01-22 14:10:59.000000000 -0800
+++ perl/embed.fnc      2007-01-22 14:47:32.000000000 -0800
@@ -294,6 +294,7 @@
 Apmb   |void   |gv_fullname3   |NN SV* sv|NN GV* gv|NULLOK const char* prefix
 Ap     |void   |gv_fullname4   |NN SV* sv|NN GV* gv|NULLOK const char* 
prefix|bool keepmain
 Ap     |void   |gv_init        |NN GV* gv|NULLOK HV* stash|NN const char* 
name|STRLEN len|int multi
+Ap     |void   |gv_name_set    |NN GV* gv|NULLOK const char *name|U32 len|U32 
flags
 Apd    |HV*    |gv_stashpv     |NN const char* name|I32 create
 Apd    |HV*    |gv_stashpvn    |NN const char* name|U32 namelen|I32 create
 Apd    |HV*    |gv_stashsv     |NULLOK SV* sv|I32 create

==== //depot/maint-5.8/perl/embed.h#135 (text+w) ====
Index: perl/embed.h
--- perl/embed.h#134~29925~     2007-01-22 14:10:59.000000000 -0800
+++ perl/embed.h        2007-01-22 14:47:32.000000000 -0800
@@ -285,6 +285,7 @@
 #define gv_fullname            Perl_gv_fullname
 #define gv_fullname4           Perl_gv_fullname4
 #define gv_init                        Perl_gv_init
+#define gv_name_set            Perl_gv_name_set
 #define gv_stashpv             Perl_gv_stashpv
 #define gv_stashpvn            Perl_gv_stashpvn
 #define gv_stashsv             Perl_gv_stashsv
@@ -2369,6 +2370,7 @@
 #define gv_fullname(a,b)       Perl_gv_fullname(aTHX_ a,b)
 #define gv_fullname4(a,b,c,d)  Perl_gv_fullname4(aTHX_ a,b,c,d)
 #define gv_init(a,b,c,d,e)     Perl_gv_init(aTHX_ a,b,c,d,e)
+#define gv_name_set(a,b,c,d)   Perl_gv_name_set(aTHX_ a,b,c,d)
 #define gv_stashpv(a,b)                Perl_gv_stashpv(aTHX_ a,b)
 #define gv_stashpvn(a,b,c)     Perl_gv_stashpvn(aTHX_ a,b,c)
 #define gv_stashsv(a,b)                Perl_gv_stashsv(aTHX_ a,b)

==== //depot/maint-5.8/perl/global.sym#51 (text+w) ====
Index: perl/global.sym
--- perl/global.sym#50~29787~   2007-01-13 09:24:48.000000000 -0800
+++ perl/global.sym     2007-01-22 14:47:32.000000000 -0800
@@ -147,6 +147,7 @@
 Perl_gv_fullname3
 Perl_gv_fullname4
 Perl_gv_init
+Perl_gv_name_set
 Perl_gv_stashpv
 Perl_gv_stashpvn
 Perl_gv_stashsv

==== //depot/maint-5.8/perl/gv.c#87 (text) ====
Index: perl/gv.c
--- perl/gv.c#86~29925~ 2007-01-22 14:10:59.000000000 -0800
+++ perl/gv.c   2007-01-22 14:47:32.000000000 -0800
@@ -212,8 +212,7 @@
     GvEGV(gv) = gv;
     sv_magic((SV*)gv, (SV*)gv, PERL_MAGIC_glob, NULL, 0);
     GvSTASH(gv) = (HV*)SvREFCNT_inc(stash);
-    GvNAME(gv) = savepvn(name, len);
-    GvNAMELEN(gv) = len;
+    gv_name_set(gv, name, len, GV_ADD);
     if (multi || doproto)              /* doproto means it _was_ mentioned */
        GvMULTI_on(gv);
     if (doproto) {                     /* Replicate part of newSUB here. */
@@ -2103,6 +2102,19 @@
     return FALSE;
 }
 
+void
+Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
+{
+    if (len > I32_MAX)
+       Perl_croak(aTHX_ "panic: gv name too long (%"UVuf")", (UV) len);
+
+    if (!(flags & GV_ADD)) {
+       Safefree(GvXPVGV(gv)->xgv_name);
+    }
+    GvXPVGV(gv)->xgv_name = name ? savepvn(name, len) : NULL;
+    GvXPVGV(gv)->xgv_namelen = len;
+}
+
 /*
  * Local variables:
  * c-indentation-style: bsd

==== //depot/maint-5.8/perl/gv.h#19 (text) ====
Index: perl/gv.h
--- perl/gv.h#18~29925~ 2007-01-22 14:10:59.000000000 -0800
+++ perl/gv.h   2007-01-22 14:47:32.000000000 -0800
@@ -31,6 +31,8 @@
 #define GvSTASH(gv)    (GvXPVGV(gv)->xgv_stash)
 #define GvFLAGS(gv)    (GvXPVGV(gv)->xgv_flags)
 
+#define GvNAME_get(gv)         (0 + GvXPVGV(gv)->xgv_name)
+#define GvNAMELEN_get(gv)      (0 + GvXPVGV(gv)->xgv_namelen)
 #define        GvASSIGN_GENERATION(gv)         (0 + ((XPV*) 
SvANY(gv))->xpv_cur)
 #define        GvASSIGN_GENERATION_set(gv,val)                 \
        STMT_START { assert(SvTYPE(gv) == SVt_PVGV);    \
@@ -161,7 +163,9 @@
 /*
  * symbol creation flags, for use in gv_fetchpv() and get_*v()
  */
-#define GV_ADD         0x01    /* add, if symbol not already there */
+#define GV_ADD         0x01    /* add, if symbol not already there
+                                  For gv_name_set, adding a HEK for the first
+                                  time, so don't try to free what's there.  */
 #define GV_ADDMULTI    0x02    /* add, pretending it has been added already */
 #define GV_ADDWARN     0x04    /* add, but warn if symbol wasn't already there 
*/
 #define GV_ADDINEVAL   0x08    /* add, as though we're doing so within an eval 
*/

==== //depot/maint-5.8/perl/proto.h#169 (text+w) ====
Index: perl/proto.h
--- perl/proto.h#168~29925~     2007-01-22 14:10:59.000000000 -0800
+++ perl/proto.h        2007-01-22 14:47:32.000000000 -0800
@@ -372,6 +372,7 @@
 /* PERL_CALLCONV void  Perl_gv_fullname3(pTHX_ SV* sv, GV* gv, const char* 
prefix); */
 PERL_CALLCONV void     Perl_gv_fullname4(pTHX_ SV* sv, GV* gv, const char* 
prefix, bool keepmain);
 PERL_CALLCONV void     Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name, 
STRLEN len, int multi);
+PERL_CALLCONV void     Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 
len, U32 flags);
 PERL_CALLCONV HV*      Perl_gv_stashpv(pTHX_ const char* name, I32 create);
 PERL_CALLCONV HV*      Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, 
I32 create);
 PERL_CALLCONV HV*      Perl_gv_stashsv(pTHX_ SV* sv, I32 create);
@@ -1795,9 +1796,7 @@
                        __attribute__warn_unused_result__;
 
 #  endif
-STATIC SV *    S_space_join_names_mortal(pTHX_ char *const *array)
-                       __attribute__nonnull__(pTHX_1);
-
+STATIC SV *    S_space_join_names_mortal(pTHX_ char *const *array);
 #endif
 
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)

==== //depot/maint-5.8/perl/sv.c#303 (text) ====
Index: perl/sv.c
--- perl/sv.c#302~29925~        2007-01-22 14:10:59.000000000 -0800
+++ perl/sv.c   2007-01-22 14:47:32.000000000 -0800
@@ -3097,8 +3097,7 @@
        sv_upgrade(dstr, SVt_PVGV);
        sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
        GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
-       GvNAME(dstr) = savepvn(name, len);
-       GvNAMELEN(dstr) = len;
+       gv_name_set((GV *)dstr, name, len, GV_ADD);
        SvFAKE_on(dstr);        /* can coerce to non-glob */
     }
 
@@ -9481,7 +9480,8 @@
                    LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
                break;
            case SVt_PVGV:
-               GvNAME(dstr)    = SAVEPVN(GvNAME(dstr), GvNAMELEN(dstr));
+               GvXPVGV(dstr)->xgv_name = SAVEPVN(GvNAME(dstr), 
GvNAMELEN(dstr));
+
                GvSTASH(dstr)   = hv_dup_inc(GvSTASH(dstr), param);
                GvGP(dstr)      = gp_dup(GvGP(dstr), param);
                (void)GpREFCNT_inc(GvGP(dstr));
End of Patch.

Reply via email to