X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/e606678100532d04b0a202d11e1d0f8323bd1564..9597860a6bc546628ff50b88916291944416e77f:/gv.h diff --git a/gv.h b/gv.h index e48d648..1e17f35 100644 --- a/gv.h +++ b/gv.h @@ -56,7 +56,7 @@ struct gp { })) # define GvNAME_get(gv) ({ assert(GvNAME_HEK(gv)); (char *)HEK_KEY(GvNAME_HEK(gv)); }) # define GvNAMELEN_get(gv) ({ assert(GvNAME_HEK(gv)); HEK_LEN(GvNAME_HEK(gv)); }) -# define GvNAMEUTF8_get(gv) ({ assert(GvNAME_HEK(gv)); HEK_UTF8(GvNAME_HEK(gv)); }) +# define GvNAMEUTF8(gv) ({ assert(GvNAME_HEK(gv)); HEK_UTF8(GvNAME_HEK(gv)); }) #else # define GvGP(gv) (0+(gv)->sv_u.svu_gp) # define GvGP_set(gv,gp) ((gv)->sv_u.svu_gp = (gp)) @@ -65,12 +65,11 @@ struct gp { # 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)) -# define GvNAMEUTF8_get(gv) HEK_UTF8(GvNAME_HEK(gv)) +# define GvNAMEUTF8(gv) HEK_UTF8(GvNAME_HEK(gv)) #endif #define GvNAME(gv) GvNAME_get(gv) #define GvNAMELEN(gv) GvNAMELEN_get(gv) -#define GvNAMEUTF8(gv) GvNAMEUTF8_get(gv) #define GvASSIGN_GENERATION(gv) (0 + ((XPV*) SvANY(gv))->xpv_len) #define GvASSIGN_GENERATION_set(gv,val) \ @@ -84,6 +83,18 @@ struct gp { Return the SV from the GV. +=for apidoc Am|AV*|GvAV|GV* gv + +Return the AV from the GV. + +=for apidoc Am|HV*|GvHV|GV* gv + +Return the HV from the GV. + +=for apidoc Am|CV*|GvCV|GV* gv + +Return the CV from the GV. + =cut */ @@ -206,7 +217,8 @@ Return the SV from the GV. #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_ADDMULTI 0x02 /* add, pretending it has been added + already; used also by gv_init_* */ #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 */ #define GV_NOINIT 0x10 /* add, but don't init symbol, if type != PVGV */ @@ -223,8 +235,15 @@ Return the SV from the GV. #define GV_NO_SVGMAGIC 0x800 /* Skip get-magic on an SV argument; used only by gv_fetchsv(_nomg) */ +/* Flags for gv_fetchmeth_pvn and gv_autoload_pvn*/ +#define GV_SUPER 0x1000 /* SUPER::method */ + +/* Flags for gv_autoload_*/ +#define GV_AUTOLOAD_ISMETHOD 1 /* autoloading a method? */ + /* SVf_UTF8 (more accurately the return value from SvUTF8) is also valid - as a flag to gv_fetch_pvn_flags, so ensure it lies outside this range. + as a flag to various gv_* functions, so ensure it lies + outside this range. */ #define GV_NOADD_MASK \ @@ -237,7 +256,21 @@ Return the SV from the GV. #define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE) #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE) #define gv_fetchsv_nomg(n,f,t) gv_fetchsv(n,(f)|GV_NO_SVGMAGIC,t) -#define gv_init(gv,stash,name,len,multi) gv_init_pvn(gv,stash,name,len,multi,0) +#define gv_init(gv,stash,name,len,multi) \ + gv_init_pvn(gv,stash,name,len,GV_ADDMULTI*!!(multi)) +#define gv_fetchmeth(stash,name,len,level) gv_fetchmeth_pvn(stash, name, len, level, 0) +#define gv_fetchmeth_autoload(stash,name,len,level) gv_fetchmeth_pvn_autoload(stash, name, len, level, 0) +#define gv_fetchmethod_flags(stash,name,flags) gv_fetchmethod_pv_flags(stash, name, flags) +#define gv_autoload4(stash, name, len, method) \ + gv_autoload_pvn(stash, name, len, !!(method)) +#define newGVgen(pack) newGVgen_flags(pack, 0) +#define gv_method_changed(gv) \ + ( \ + assert_(isGV_with_GP(gv)) \ + GvREFCNT(gv) > 1 \ + ? (void)++PL_sub_generation \ + : mro_method_changed_in(GvSTASH(gv)) \ + ) #define gv_AVadd(gv) gv_add_by_type((gv), SVt_PVAV) #define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV) @@ -248,8 +281,8 @@ Return the SV from the GV. * Local variables: * c-indentation-style: bsd * c-basic-offset: 4 - * indent-tabs-mode: t + * indent-tabs-mode: nil * End: * - * ex: set ts=8 sts=4 sw=4 noet: + * ex: set ts=8 sts=4 sw=4 et: */