X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cv.h;h=262d44c63572e5bbd1456d451c21fae97e432208;hb=3bf198a5e20d135d4136d3233d58cf49a70772d9;hp=2675ede847dac9ce32d887c3a87c4288f9d13acf;hpb=8990e3071044a96302560bbdb5706f3e74cf1bef;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cv.h b/cv.h index 2675ede..262d44c 100644 --- a/cv.h +++ b/cv.h @@ -1,18 +1,19 @@ -/* $RCSfile: cv.h,v $$Revision: 4.1 $$Date: 92/08/07 18:26:42 $ +/* cv.h * - * Copyright (c) 1991, Larry Wall + * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * - * $Log: cv.h,v $ */ +/* This structure much match the beginning of XPVFM */ + struct xpvcv { char * xpv_pv; /* pointer to malloced string */ STRLEN xpv_cur; /* length of xp_pv as a C string */ STRLEN xpv_len; /* allocated size */ - STRLEN xof_off; /* ptr is incremented by offset */ + IV xof_off; /* integer value */ double xnv_nv; /* numeric value, if any */ MAGIC* xmg_magic; /* magic for scalar array */ HV* xmg_stash; /* class package */ @@ -20,23 +21,58 @@ struct xpvcv { HV * xcv_stash; OP * xcv_start; OP * xcv_root; - I32 (*xcv_usersub)(); - I32 xcv_userindex; + void (*xcv_xsub) _((CV*)); + ANY xcv_xsubany; GV * xcv_gv; GV * xcv_filegv; long xcv_depth; /* >= 2 indicates recursive call */ AV * xcv_padlist; - bool xcv_deleted; + CV * xcv_outside; + U8 xcv_flags; }; + #define Nullcv Null(CV*) + #define CvSTASH(sv) ((XPVCV*)SvANY(sv))->xcv_stash #define CvSTART(sv) ((XPVCV*)SvANY(sv))->xcv_start #define CvROOT(sv) ((XPVCV*)SvANY(sv))->xcv_root -#define CvUSERSUB(sv) ((XPVCV*)SvANY(sv))->xcv_usersub -#define CvUSERINDEX(sv) ((XPVCV*)SvANY(sv))->xcv_userindex +#define CvXSUB(sv) ((XPVCV*)SvANY(sv))->xcv_xsub +#define CvXSUBANY(sv) ((XPVCV*)SvANY(sv))->xcv_xsubany #define CvGV(sv) ((XPVCV*)SvANY(sv))->xcv_gv #define CvFILEGV(sv) ((XPVCV*)SvANY(sv))->xcv_filegv #define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xcv_depth #define CvPADLIST(sv) ((XPVCV*)SvANY(sv))->xcv_padlist -#define CvDELETED(sv) ((XPVCV*)SvANY(sv))->xcv_deleted +#define CvOUTSIDE(sv) ((XPVCV*)SvANY(sv))->xcv_outside +#define CvFLAGS(sv) ((XPVCV*)SvANY(sv))->xcv_flags + +#define CVf_CLONE 0x01 /* anon CV uses external lexicals */ +#define CVf_CLONED 0x02 /* a clone of one of those */ +#define CVf_ANON 0x04 /* CvGV() can't be trusted */ +#define CVf_OLDSTYLE 0x08 +#define CVf_UNIQUE 0x10 /* can't be cloned */ +#define CVf_NODEBUG 0x20 /* no DB::sub indirection for this CV + (esp. useful for special XSUBs) */ + +#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) +#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) +#define CvCLONE_off(cv) (CvFLAGS(cv) &= ~CVf_CLONE) + +#define CvCLONED(cv) (CvFLAGS(cv) & CVf_CLONED) +#define CvCLONED_on(cv) (CvFLAGS(cv) |= CVf_CLONED) +#define CvCLONED_off(cv) (CvFLAGS(cv) &= ~CVf_CLONED) + +#define CvANON(cv) (CvFLAGS(cv) & CVf_ANON) +#define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON) +#define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON) + +#define CvOLDSTYLE(cv) (CvFLAGS(cv) & CVf_OLDSTYLE) +#define CvOLDSTYLE_on(cv) (CvFLAGS(cv) |= CVf_OLDSTYLE) +#define CvOLDSTYLE_off(cv) (CvFLAGS(cv) &= ~CVf_OLDSTYLE) + +#define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE) +#define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE) +#define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE) +#define CvNODEBUG(cv) (CvFLAGS(cv) & CVf_NODEBUG) +#define CvNODEBUG_on(cv) (CvFLAGS(cv) |= CVf_NODEBUG) +#define CvNODEBUG_off(cv) (CvFLAGS(cv) &= ~CVf_NODEBUG)