This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove some _get variants of *NAMEUTF8 macros in [gh]v.h
[perl5.git] / gv.h
diff --git a/gv.h b/gv.h
index a97d4ba..9aa4eff 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -1,7 +1,7 @@
 /*    gv.h
  *
- *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
 
 struct gp {
     SV *       gp_sv;          /* scalar value */
-    U32                gp_refcnt;      /* how many globs point to this? */
     struct io *        gp_io;          /* filehandle value */
-    CV *       gp_form;        /* format value */
-    AV *       gp_av;          /* array value */
-    HV *       gp_hv;          /* hash value */
-    GV *       gp_egv;         /* effective gv, if *glob */
     CV *       gp_cv;          /* subroutine value */
     U32                gp_cvgen;       /* generational validity of cached gv_cv */
+    U32                gp_refcnt;      /* how many globs point to this? */
+    HV *       gp_hv;          /* hash value */
+    AV *       gp_av;          /* array value */
+    CV *       gp_form;        /* format value */
+    GV *       gp_egv;         /* effective gv, if *glob */
     line_t     gp_line;        /* line first declared at (for -w) */
-    char *     gp_file;        /* file first declared in (for -w) */
+    HEK *      gp_file_hek;    /* file first declared in (for -w) */
 };
 
 #define GvXPVGV(gv)    ((XPVGV*)SvANY(gv))
 
-#ifdef DEBUGGING
-#  define GvGP(gv)     (*(assert(SvTYPE(gv) == SVt_PVGV || \
-                                 SvTYPE(gv) == SVt_PVLV), \
-                          &(GvXPVGV(gv)->xgv_gp)))
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
+#  define GvGP(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);})))
+#  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); \
+           assert(isGV_with_GP(_gvflags));                             \
+           &(GvXPVGV(_gvflags)->xpv_cur);}))
+#  define GvSTASH(gv)                                                  \
+       (*({ GV * const _gvstash = (GV *) (gv);                         \
+           assert(isGV_with_GP(_gvstash));                             \
+           assert(SvTYPE(_gvstash) == SVt_PVGV || SvTYPE(_gvstash) >= SVt_PVLV); \
+           &(GvXPVGV(_gvstash)->xnv_u.xgv_stash);                      \
+        }))
+#  define GvNAME_HEK(gv)                                               \
+    (*({ GV * const _gvname_hek = (GV *) (gv);                         \
+          assert(isGV_with_GP(_gvname_hek));                           \
+          assert(SvTYPE(_gvname_hek) == SVt_PVGV || SvTYPE(_gvname_hek) >= SVt_PVLV); \
+          assert(!SvVALID(_gvname_hek));                               \
+          &(GvXPVGV(_gvname_hek)->xiv_u.xivu_namehek);                 \
+        }))
+#  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)     (GvXPVGV(gv)->xgv_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)     (GvXPVGV(gv)->xgv_name)
-#define GvNAMELEN(gv)  (GvXPVGV(gv)->xgv_namelen)
-#define GvSTASH(gv)    (GvXPVGV(gv)->xgv_stash)
-#define GvFLAGS(gv)    (GvXPVGV(gv)->xgv_flags)
+#define GvNAME(gv)     GvNAME_get(gv)
+#define GvNAMELEN(gv)  GvNAMELEN_get(gv)
+
+#define        GvASSIGN_GENERATION(gv)         (0 + ((XPV*) SvANY(gv))->xpv_len)
+#define        GvASSIGN_GENERATION_set(gv,val)                 \
+       STMT_START { assert(SvTYPE(gv) == SVt_PVGV);    \
+               (((XPV*) SvANY(gv))->xpv_len = (val)); } STMT_END
 
 /*
 =head1 GV Functions
@@ -57,16 +96,23 @@ Return the SV from the GV.
 #endif
 
 #define GvREFCNT(gv)   (GvGP(gv)->gp_refcnt)
-#define GvIO(gv)       ((gv) && SvTYPE((SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : 0)
+#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)))
 
 #define GvFORM(gv)     (GvGP(gv)->gp_form)
 #define GvAV(gv)       (GvGP(gv)->gp_av)
 
-/* This macro is deprecated.  Do not use! */
-#define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv))       /* DO NOT USE */
-
 #define GvAVn(gv)      (GvGP(gv)->gp_av ? \
                         GvGP(gv)->gp_av : \
                         GvGP(gv_AVadd(gv))->gp_av)
@@ -76,16 +122,22 @@ 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 ? Nullcv : GvGP(gv)->gp_cv)
+#define GvCVu(gv)      (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv)
 
 #define GvLINE(gv)     (GvGP(gv)->gp_line)
-#define GvFILE(gv)     (GvGP(gv)->gp_file)
+#define GvFILE_HEK(gv) (GvGP(gv)->gp_file_hek)
+#define GvFILE(gv)     (GvFILE_HEK(gv) ? HEK_KEY(GvFILE_HEK(gv)) : NULL)
 #define GvFILEGV(gv)   (gv_fetchfile(GvFILE(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
@@ -134,30 +186,25 @@ Return the SV from the GV.
 #define GvIN_PAD_on(gv)                (GvFLAGS(gv) |= GVf_IN_PAD)
 #define GvIN_PAD_off(gv)       (GvFLAGS(gv) &= ~GVf_IN_PAD)
 
-#define GvUNIQUE(gv)            0
-#define GvUNIQUE_on(gv)
-#define GvUNIQUE_off(gv)
-
-#ifdef USE_ITHREADS
-#define GV_UNIQUE_CHECK
-#else
-#undef  GV_UNIQUE_CHECK
+#ifndef PERL_CORE
+#  define Nullgv Null(GV*)
 #endif
 
-#define Nullgv Null(GV*)
-
-#define DM_UID   0x003
-#define DM_RUID   0x001
-#define DM_EUID   0x002
-#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()
  */
-#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 */
@@ -167,10 +214,42 @@ Return the SV from the GV.
 #define GV_NOADD_NOINIT        0x20    /* Don't add the symbol if it's not there.
                                   Don't init it if it is there but ! PVGV */
 #define GV_NOEXPAND    0x40    /* Don't expand SvOK() entries to PVGV */
+#define GV_NOTQUAL     0x80    /* A plain symbol name, not qualified with a
+                                  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|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_fetchmeth(stash,name, len,level) gv_fetchmeth_pvn(stash, name, len, level, 0)
+
+#define gv_AVadd(gv) gv_add_by_type((gv), SVt_PVAV)
+#define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV)
+#define gv_IOadd(gv) gv_add_by_type((gv), SVt_PVIO)
+#define gv_SVadd(gv) gv_add_by_type((gv), SVt_NULL)
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */