1 /* gv.h 2 * 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 4 * 2000, 2001, 2002, by Larry Wall and others 5 * 6 * You may distribute under the terms of either the GNU General Public 7 * License or the Artistic License, as specified in the README file. 8 * 9 */ 10 11 struct gp { 12 SV * gp_sv; /* scalar value */ 13 U32 gp_refcnt; /* how many globs point to this? */ 14 struct io * gp_io; /* filehandle value */ 15 CV * gp_form; /* format value */ 16 AV * gp_av; /* array value */ 17 HV * gp_hv; /* hash value */ 18 GV * gp_egv; /* effective gv, if *glob */ 19 CV * gp_cv; /* subroutine value */ 20 U32 gp_cvgen; /* generational validity of cached gv_cv */ 21 U32 gp_flags; /* XXX unused */ 22 line_t gp_line; /* line first declared at (for -w) */ 23 char * gp_file; /* file first declared in (for -w) */ 24 }; 25 26 #define GvXPVGV(gv) ((XPVGV*)SvANY(gv)) 27 28 #define GvGP(gv) (GvXPVGV(gv)->xgv_gp) 29 #define GvNAME(gv) (GvXPVGV(gv)->xgv_name) 30 #define GvNAMELEN(gv) (GvXPVGV(gv)->xgv_namelen) 31 #define GvSTASH(gv) (GvXPVGV(gv)->xgv_stash) 32 #define GvFLAGS(gv) (GvXPVGV(gv)->xgv_flags) 33 34 /* 35 =head1 GV Functions 36 37 =for apidoc Am|SV*|GvSV|GV* gv 38 39 Return the SV from the GV. 40 41 =cut 42 */ 43 44 #define GvSV(gv) (GvGP(gv)->gp_sv) 45 #define GvREFCNT(gv) (GvGP(gv)->gp_refcnt) 46 #define GvIO(gv) ((gv) && SvTYPE((SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : 0) 47 #define GvIOp(gv) (GvGP(gv)->gp_io) 48 #define GvIOn(gv) (GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv))) 49 50 #define GvFORM(gv) (GvGP(gv)->gp_form) 51 #define GvAV(gv) (GvGP(gv)->gp_av) 52 53 /* This macro is deprecated. Do not use! */ 54 #define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv)) /* DO NOT USE */ 55 56 #define GvAVn(gv) (GvGP(gv)->gp_av ? \ 57 GvGP(gv)->gp_av : \ 58 GvGP(gv_AVadd(gv))->gp_av) 59 #define GvHV(gv) ((GvGP(gv))->gp_hv) 60 61 #define GvHVn(gv) (GvGP(gv)->gp_hv ? \ 62 GvGP(gv)->gp_hv : \ 63 GvGP(gv_HVadd(gv))->gp_hv) 64 65 #define GvCV(gv) (GvGP(gv)->gp_cv) 66 #define GvCVGEN(gv) (GvGP(gv)->gp_cvgen) 67 #define GvCVu(gv) (GvGP(gv)->gp_cvgen ? Nullcv : GvGP(gv)->gp_cv) 68 69 #define GvGPFLAGS(gv) (GvGP(gv)->gp_flags) 70 71 #define GvLINE(gv) (GvGP(gv)->gp_line) 72 #define GvFILE(gv) (GvGP(gv)->gp_file) 73 #define GvFILEGV(gv) (gv_fetchfile(GvFILE(gv))) 74 75 #define GvEGV(gv) (GvGP(gv)->gp_egv) 76 #define GvENAME(gv) GvNAME(GvEGV(gv) ? GvEGV(gv) : gv) 77 #define GvESTASH(gv) GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv) 78 79 #define GVf_INTRO 0x01 80 #define GVf_MULTI 0x02 81 #define GVf_ASSUMECV 0x04 82 #define GVf_IN_PAD 0x08 83 #define GVf_IMPORTED 0xF0 84 #define GVf_IMPORTED_SV 0x10 85 #define GVf_IMPORTED_AV 0x20 86 #define GVf_IMPORTED_HV 0x40 87 #define GVf_IMPORTED_CV 0x80 88 89 #define GvINTRO(gv) (GvFLAGS(gv) & GVf_INTRO) 90 #define GvINTRO_on(gv) (GvFLAGS(gv) |= GVf_INTRO) 91 #define GvINTRO_off(gv) (GvFLAGS(gv) &= ~GVf_INTRO) 92 93 #define GvMULTI(gv) (GvFLAGS(gv) & GVf_MULTI) 94 #define GvMULTI_on(gv) (GvFLAGS(gv) |= GVf_MULTI) 95 #define GvMULTI_off(gv) (GvFLAGS(gv) &= ~GVf_MULTI) 96 97 #define GvASSUMECV(gv) (GvFLAGS(gv) & GVf_ASSUMECV) 98 #define GvASSUMECV_on(gv) (GvFLAGS(gv) |= GVf_ASSUMECV) 99 #define GvASSUMECV_off(gv) (GvFLAGS(gv) &= ~GVf_ASSUMECV) 100 101 #define GvIMPORTED(gv) (GvFLAGS(gv) & GVf_IMPORTED) 102 #define GvIMPORTED_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED) 103 #define GvIMPORTED_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED) 104 105 #define GvIMPORTED_SV(gv) (GvFLAGS(gv) & GVf_IMPORTED_SV) 106 #define GvIMPORTED_SV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_SV) 107 #define GvIMPORTED_SV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_SV) 108 109 #define GvIMPORTED_AV(gv) (GvFLAGS(gv) & GVf_IMPORTED_AV) 110 #define GvIMPORTED_AV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_AV) 111 #define GvIMPORTED_AV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_AV) 112 113 #define GvIMPORTED_HV(gv) (GvFLAGS(gv) & GVf_IMPORTED_HV) 114 #define GvIMPORTED_HV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_HV) 115 #define GvIMPORTED_HV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_HV) 116 117 #define GvIMPORTED_CV(gv) (GvFLAGS(gv) & GVf_IMPORTED_CV) 118 #define GvIMPORTED_CV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_CV) 119 #define GvIMPORTED_CV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_CV) 120 121 #define GvIN_PAD(gv) (GvFLAGS(gv) & GVf_IN_PAD) 122 #define GvIN_PAD_on(gv) (GvFLAGS(gv) |= GVf_IN_PAD) 123 #define GvIN_PAD_off(gv) (GvFLAGS(gv) &= ~GVf_IN_PAD) 124 125 /* XXX: all GvFLAGS options are used, borrowing GvGPFLAGS for the moment */ 126 127 #define GVf_UNIQUE 0x0001 128 #define GvUNIQUE(gv) (GvGP(gv) && (GvGPFLAGS(gv) & GVf_UNIQUE)) 129 #define GvUNIQUE_on(gv) (GvGPFLAGS(gv) |= GVf_UNIQUE) 130 #define GvUNIQUE_off(gv) (GvGPFLAGS(gv) &= ~GVf_UNIQUE) 131 132 #ifdef USE_ITHREADS 133 #define GV_UNIQUE_CHECK 134 #else 135 #undef GV_UNIQUE_CHECK 136 #endif 137 138 #define Nullgv Null(GV*) 139 140 #define DM_UID 0x003 141 #define DM_RUID 0x001 142 #define DM_EUID 0x002 143 #define DM_GID 0x030 144 #define DM_RGID 0x010 145 #define DM_EGID 0x020 146 #define DM_DELAY 0x100 147 148 /* 149 * symbol creation flags, for use in gv_fetchpv() and get_*v() 150 */ 151 #define GV_ADD 0x01 /* add, if symbol not already there */ 152 #define GV_ADDMULTI 0x02 /* add, pretending it has been added already */ 153 #define GV_ADDWARN 0x04 /* add, but warn if symbol wasn't already there */ 154 #define GV_ADDINEVAL 0x08 /* add, as though we're doing so within an eval */ 155 #define GV_NOINIT 0x10 /* add, but don't init symbol, if type != PVGV */ 156