Ensure GvNAME doesn't return NULL
Marcus Holland-Moritz [Sun, 23 Apr 2006 04:47:04 +0000 (06:47 +0200)]
First patch from :
Subject: Re: [PATCH] cleanup 212 warnings emitted by gcc-4.2
Message-ID: <20060423044704.6a383ee8@r2d2>

p4raw-id: //depot/perl@27944

embed.fnc
gv.c
gv.h
proto.h

index a1bc225..cca7933 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -283,7 +283,7 @@ Ap  |void   |gv_fullname    |NN SV* sv|NN const GV* gv
 Apmb   |void   |gv_fullname3   |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
 Ap     |void   |gv_fullname4   |NN SV* sv|NN const 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
+Ap     |void   |gv_name_set    |NN GV* gv|NN 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
diff --git a/gv.c b/gv.c
index 9834b7a..879a14b 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -2117,6 +2117,7 @@ Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
     dVAR;
     U32 hash;
 
+    assert(name);
     PERL_UNUSED_ARG(flags);
 
     if (len > I32_MAX)
@@ -2127,7 +2128,7 @@ Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags)
     }
 
     PERL_HASH(hash, name, len);
-    GvNAME_HEK(gv) = name ? share_hek(name, len, hash) : 0;
+    GvNAME_HEK(gv) = share_hek(name, len, hash);
 }
 
 /*
diff --git a/gv.h b/gv.h
index ab74552..4013912 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -48,16 +48,17 @@ struct gp {
           assert(SvTYPE(zzzz) == SVt_PVGV || SvTYPE(zzzz) >= SVt_PVLV); \
           &(GvXPVGV(zzzz)->xiv_u.xivu_namehek);                        \
         }))
+#  define GvNAME_get(gv)       ({ assert(GvNAME_HEK(gv)); HEK_KEY(GvNAME_HEK(gv)); })
+#  define GvNAMELEN_get(gv)    ({ assert(GvNAME_HEK(gv)); HEK_LEN(GvNAME_HEK(gv)); })
 #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_HEK(gv)       (GvXPVGV(gv)->xiv_u.xivu_namehek)
+#  define GvNAME_get(gv)       HEK_KEY(GvNAME_HEK(gv))
+#  define GvNAMELEN_get(gv)    HEK_LEN(GvNAME_HEK(gv))
 #endif
 
-#define GvNAME_get(gv)         (GvNAME_HEK(gv) ? HEK_KEY(GvNAME_HEK(gv)) : NULL)
-#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)
 
diff --git a/proto.h b/proto.h
index 54aecd9..6c7679b 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -650,7 +650,8 @@ PERL_CALLCONV void  Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLE
                        __attribute__nonnull__(pTHX_3);
 
 PERL_CALLCONV void     Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 len, U32 flags)
-                       __attribute__nonnull__(pTHX_1);
+                       __attribute__nonnull__(pTHX_1)
+                       __attribute__nonnull__(pTHX_2);
 
 PERL_CALLCONV HV*      Perl_gv_stashpv(pTHX_ const char* name, I32 create)
                        __attribute__nonnull__(pTHX_1);