This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta: combine, merge, and edit "modules updated"
[perl5.git] / gv.h
diff --git a/gv.h b/gv.h
index 7e412e5..1e17f35 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,13 +56,16 @@ 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(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(gv)       HEK_UTF8(GvNAME_HEK(gv))
 #endif
 
 #define GvNAME(gv)     GvNAME_get(gv)
@@ -75,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
 */
 
@@ -88,7 +108,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 +134,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 +147,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 +202,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_ARRAY 0x004
-#define DM_GID   0x030
-#define DM_RGID   0x010
-#define DM_EGID   0x020
-#define DM_DELAY 0x100
+#define DM_RUID      0x001
+#define DM_EUID      0x002
+#define DM_UID       (DM_RUID|DM_EUID)
+#define DM_ARRAY_ISA 0x004
+#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()
@@ -183,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 */
@@ -196,17 +231,46 @@ 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) */
+
+/* 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  (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,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)
@@ -217,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:
  */