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.