X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/f5c1e8072077f841044d944ef64ecf3a45cff725..bee6d11532124d429869bc62306535b2a74bff79:/gv.h diff --git a/gv.h b/gv.h index de8ec52..ab74552 100644 --- a/gv.h +++ b/gv.h @@ -28,8 +28,7 @@ struct gp { #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) # define GvGP(gv) \ (*({GV *const shplep = (GV *) (gv); \ - assert(SvTYPE(shplep) == SVt_PVGV || \ - SvTYPE(shplep) == SVt_PVLV); \ + assert(SvTYPE(shplep) == SVt_PVGV || SvTYPE(shplep) == SVt_PVLV); \ assert(isGV_with_GP(shplep)); \ &((shplep)->sv_u.svu_gp);})) # define GvFLAGS(gv) \ @@ -43,26 +42,22 @@ struct gp { 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)->xiv_u.xivu_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)->xiv_u.xivu_namehek) #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) @@ -191,7 +186,9 @@ Return the SV from the GV. /* * 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 */