This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
gv.c: Added gv_init_(sv|pv|pvn), renamed gv_init_sv as gv_init_svtype.
[perl5.git] / gv.h
diff --git a/gv.h b/gv.h
index 4286491..e48d648 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -27,10 +27,15 @@ struct gp {
 
 #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
 #  define GvGP(gv)                                                     \
-       (*({GV *const _gvgp = (GV *) (gv);                              \
+       (0+(*({GV *const _gvgp = (GV *) (gv);                           \
            assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \
            assert(isGV_with_GP(_gvgp));                                \
-           &((_gvgp)->sv_u.svu_gp);}))
+           &((_gvgp)->sv_u.svu_gp);})))
+#  define GvGP_set(gv,gp)                                              \
+       {GV *const _gvgp = (GV *) (gv);                         \
+           assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \
+           assert(isGV_with_GP(_gvgp));                                \
+           (_gvgp)->sv_u.svu_gp = (gp); }
 #  define GvFLAGS(gv)                                                  \
        (*({GV *const _gvflags = (GV *) (gv);                           \
            assert(SvTYPE(_gvflags) == SVt_PVGV || SvTYPE(_gvflags) == SVt_PVLV); \
@@ -51,17 +56,21 @@ 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)); })
 #else
-#  define GvGP(gv)     ((gv)->sv_u.svu_gp)
+#  define GvGP(gv)     (0+(gv)->sv_u.svu_gp)
+#  define GvGP_set(gv,gp)      ((gv)->sv_u.svu_gp = (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))
+#  define GvNAMEUTF8_get(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)                 \
@@ -88,7 +97,17 @@ Return the SV from the GV.
 #endif
 
 #define GvREFCNT(gv)   (GvGP(gv)->gp_refcnt)
-#define GvIO(gv)       ((gv) && SvTYPE((const SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : NULL)
+#define GvIO(gv)                         \
+ (                                        \
+     (gv)                                  \
+  && (                                      \
+         SvTYPE((const SV*)(gv)) == SVt_PVGV \
+      || SvTYPE((const SV*)(gv)) == SVt_PVLV  \
+     )                                         \
+  && GvGP(gv)                                   \
+   ? GvIOp(gv)                                   \
+   : NULL                                         \
+ )
 #define GvIOp(gv)      (GvGP(gv)->gp_io)
 #define GvIOn(gv)      (GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv)))
 
@@ -104,7 +123,8 @@ Return the SV from the GV.
                         GvGP(gv)->gp_hv : \
                         GvGP(gv_HVadd(gv))->gp_hv)
 
-#define GvCV(gv)       (GvGP(gv)->gp_cv)
+#define GvCV(gv)       (0+GvGP(gv)->gp_cv)
+#define GvCV_set(gv,cv)        (GvGP(gv)->gp_cv = (cv))
 #define GvCVGEN(gv)    (GvGP(gv)->gp_cvgen)
 #define GvCVu(gv)      (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv)
 
@@ -116,6 +136,9 @@ Return the SV from the GV.
 #define GvEGV(gv)      (GvGP(gv)->gp_egv)
 #define GvEGVx(gv)     (isGV_with_GP(gv) ? GvEGV(gv) : NULL)
 #define GvENAME(gv)    GvNAME(GvEGV(gv) ? GvEGV(gv) : gv)
+#define GvENAMELEN(gv)  GvNAMELEN(GvEGV(gv) ? GvEGV(gv) : gv)
+#define GvENAMEUTF8(gv) GvNAMEUTF8(GvEGV(gv) ? GvEGV(gv) : gv)
+#define GvENAME_HEK(gv) GvNAME_HEK(GvEGV(gv) ? GvEGV(gv) : gv)
 #define GvESTASH(gv)   GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv)
 
 #define GVf_INTRO      0x01
@@ -168,14 +191,14 @@ Return the SV from the GV.
 #  define Nullgv Null(GV*)
 #endif
 
-#define DM_UID   0x003
-#define DM_RUID   0x001
-#define DM_EUID   0x002
+#define DM_RUID      0x001
+#define DM_EUID      0x002
+#define DM_UID       (DM_RUID|DM_EUID)
 #define DM_ARRAY_ISA 0x004
-#define DM_GID   0x030
-#define DM_RGID   0x010
-#define DM_EGID   0x020
-#define DM_DELAY 0x100
+#define DM_RGID      0x010
+#define DM_EGID      0x020
+#define DM_GID       (DM_RGID|DM_EGID)
+#define DM_DELAY     0x100
 
 /*
  * symbol creation flags, for use in gv_fetchpv() and get_*v()
@@ -196,17 +219,25 @@ Return the SV from the GV.
                                   package (so skip checks for :: and ')  */
 #define GV_AUTOLOAD    0x100   /* gv_fetchmethod_flags() should AUTOLOAD  */
 #define GV_CROAK       0x200   /* gv_fetchmethod_flags() should croak  */
+#define GV_ADDMG       0x400   /* add if magical */
+#define GV_NO_SVGMAGIC 0x800   /* Skip get-magic on an SV argument;
+                                  used only by gv_fetchsv(_nomg) */
 
 /*      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.
 */
 
-#define GV_NOADD_MASK  (SVf_UTF8|GV_NOADD_NOINIT|GV_NOEXPAND|GV_NOTQUAL)
-/* The bit flags that don't cause gv_fetchpv() to add a symbol if not found */
+#define GV_NOADD_MASK \
+  (SVf_UTF8|GV_NOADD_NOINIT|GV_NOEXPAND|GV_NOTQUAL|GV_ADDMG|GV_NO_SVGMAGIC)
+/* The bit flags that don't cause gv_fetchpv() to add a symbol if not
+   found (with the exception GV_ADDMG, which *might* cause the symbol
+   to be added) */
 
 #define gv_fullname3(sv,gv,prefix) gv_fullname4(sv,gv,prefix,TRUE)
 #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_AVadd(gv) gv_add_by_type((gv), SVt_PVAV)
 #define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV)