This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix input type on isFOO macros
[perl5.git] / gv.h
diff --git a/gv.h b/gv.h
index 7792017..36d7745 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -26,7 +26,7 @@ struct gp {
 #define GvXPVGV(gv)    ((XPVGV*)SvANY(gv))
 
 
-#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
+#if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) && !defined(__INTEL_COMPILER)
 #  define GvGP(gv)                                                     \
        (0+(*({GV *const _gvgp = (GV *) (gv);                           \
            assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \
@@ -52,7 +52,6 @@ struct gp {
     (*({ 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)); })
@@ -72,13 +71,8 @@ struct gp {
 #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
+=for apidoc_section GV Handling
 
 =for apidoc Am|SV*|GvSV|GV* gv
 
@@ -101,9 +95,9 @@ Return the CV from the GV.
 
 #define GvSV(gv)       (GvGP(gv)->gp_sv)
 #ifdef PERL_DONT_CREATE_GVSV
-#define GvSVn(gv)      (GvGP(gv)->gp_sv ? \
-                        GvGP(gv)->gp_sv : \
-                        Perl_gv_add_by_type_p(aTHX_ (gv), GPe_SV))
+#define GvSVn(gv)      (*(GvGP(gv)->gp_sv ? \
+                        &(GvGP(gv)->gp_sv) : \
+                        &(GvGP(gv_SVadd(gv))->gp_sv)))
 #else
 #define GvSVn(gv)      GvSV(gv)
 #endif
@@ -121,22 +115,19 @@ Return the CV from the GV.
    : NULL                                         \
  )
 #define GvIOp(gv)      (GvGP(gv)->gp_io)
-#define GvIOn(gv) \
-       (GvIO(gv) \
-               ? GvIOp(gv) \
-               : (struct io *)Perl_gv_add_by_type_p(aTHX_ (gv), GPe_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)
 
 #define GvAVn(gv)      (GvGP(gv)->gp_av ? \
                         GvGP(gv)->gp_av : \
-                        (AV*)Perl_gv_add_by_type_p(aTHX_ (gv), GPe_AV))
+                        GvGP(gv_AVadd(gv))->gp_av)
 #define GvHV(gv)       ((GvGP(gv))->gp_hv)
 
 #define GvHVn(gv)      (GvGP(gv)->gp_hv ? \
                         GvGP(gv)->gp_hv : \
-                        (HV*)Perl_gv_add_by_type_p(aTHX_ (gv), GPe_HV))
+                        GvGP(gv_HVadd(gv))->gp_hv)
 
 #define GvCV(gv)       (0+GvGP(gv)->gp_cv)
 #define GvCV_set(gv,cv)        (GvGP(gv)->gp_cv = (cv))
@@ -159,6 +150,10 @@ Return the CV from the GV.
 #define GvENAME_HEK(gv) GvNAME_HEK(GvEGV(gv) ? GvEGV(gv) : gv)
 #define GvESTASH(gv)   GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv)
 
+/* GVf_INTRO is one-shot flag which indicates that the next assignment
+   of a reference to the glob is to be localised; it distinguishes
+   'local *g = $ref' from '*g = $ref'.
+*/
 #define GVf_INTRO      0x01
 #define GVf_MULTI      0x02
 #define GVf_ASSUMECV   0x04
@@ -201,12 +196,6 @@ Return the CV from the GV.
 #define GvIMPORTED_CV_on(gv)   (GvFLAGS(gv) |= GVf_IMPORTED_CV)
 #define GvIMPORTED_CV_off(gv)  (GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
 
-#define GPf_ALIASED_SV 1
-
-#define GvALIASED_SV(gv)       (GvGPFLAGS(gv) & GPf_ALIASED_SV)
-#define GvALIASED_SV_on(gv)    (GvGPFLAGS(gv) |= GPf_ALIASED_SV)
-#define GvALIASED_SV_off(gv)   (GvGPFLAGS(gv) &= ~GPf_ALIASED_SV)
-
 #ifndef PERL_CORE
 #  define GvIN_PAD(gv)         0
 #  define GvIN_PAD_on(gv)      NOOP
@@ -275,8 +264,8 @@ Return the CV from the GV.
 #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 gv_autoload4(stash, name, len, autoload) \
+       gv_autoload_pvn(stash, name, len, !!(autoload))
 #define newGVgen(pack)  newGVgen_flags(pack, 0)
 #define gv_method_changed(gv)              \
     (                                       \
@@ -286,25 +275,11 @@ Return the CV from the GV.
            : mro_method_changed_in(GvSTASH(gv)) \
     )
 
-/* used by Perl_gv_add_by_type_p for option checking, low bits are free here*/
-typedef enum {
-    GPe_SV = STRUCT_OFFSET(GP, gp_sv),
-    GPe_IO = STRUCT_OFFSET(GP, gp_io),
-    GPe_HV = STRUCT_OFFSET(GP, gp_hv),
-    GPe_AV = STRUCT_OFFSET(GP, gp_av),
-} gv_add_type;
-
-#define gv_AVadd(gv) (Perl_gv_add_by_type_p(aTHX_ (gv), GPe_AV), gv)
-#define gv_HVadd(gv) (Perl_gv_add_by_type_p(aTHX_ (gv), GPe_HV), gv)
-#define gv_IOadd(gv) (Perl_gv_add_by_type_p(aTHX_ (gv), GPe_IO), gv)
-#define gv_SVadd(gv) (Perl_gv_add_by_type_p(aTHX_ (gv), GPe_SV), gv)
+#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: nil
- * End:
- *
  * ex: set ts=8 sts=4 sw=4 et:
  */