};
struct cv {
- XPVGV* sv_any; /* pointer to something */
+ XPVCV* sv_any; /* pointer to something */
U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
};
#define SVf_POK 0x00040000 /* has valid public pointer value */
#define SVf_ROK 0x00080000 /* has a valid reference pointer */
-#define SVf_FAKE 0x00100000 /* glob is just a copy */
+#define SVf_FAKE 0x00100000 /* glob or lexical is just a copy */
#define SVf_OOK 0x00200000 /* has valid offset value */
#define SVf_BREAK 0x00400000 /* refcnt is artificially low */
#define SVf_READONLY 0x00800000 /* may not be modified */
#define SVpbm_CASEFOLD 0x40000000
#define SVpbm_TAIL 0x20000000
-#define SVpgv_MULTI 0x80000000
+#define SVphv_SHAREKEYS 0x20000000 /* keys live on shared string table */
#ifdef OVERLOAD
#define SVpgv_AM 0x40000000
char* xgv_name;
STRLEN xgv_namelen;
HV* xgv_stash;
+ U8 xgv_flags;
};
struct xpvbm {
GV * xcv_filegv;
long xcv_depth; /* >= 2 indicates recursive call */
AV * xcv_padlist;
+ CV * xcv_outside;
I32 xfm_lines;
};
#define IOf_ARGV 1 /* this fp iterates over ARGV */
#define IOf_START 2 /* check for null ARGV and substitute '-' */
#define IOf_FLUSH 4 /* this fp wants a flush after write op */
+#define IOf_DIDTOP 8 /* just did top of form */
/* The following macros define implementation-independent predicates on SVs. */
#define SvNIOK(sv) (SvFLAGS(sv) & (SVf_IOK|SVf_NOK))
+#define SvNIOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK))
#define SvNIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
SVp_IOK|SVp_NOK))
#define SvIOK_on(sv) (SvOOK_off(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK))
-#define SvIOK_only(sv) (SvOK_off(sv), \
+#define SvIOK_only(sv) (SvOOK_off(sv), SvOK_off(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
#define SvNOK(sv) (SvFLAGS(sv) & SVf_NOK)
#define SvPOK(sv) (SvFLAGS(sv) & SVf_POK)
#define SvPOK_on(sv) (SvFLAGS(sv) |= (SVf_POK|SVp_POK))
#define SvPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
-#define SvPOK_only(sv) (SvOK_off(sv), \
+
+#ifdef OVERLOAD
+#define SvPOK_only(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC), \
SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#else
+#define SvPOK_only(sv) (SvFLAGS(sv) &= ~SVf_OK, \
+ SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#endif /* OVERLOAD */
#define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK)
#define SvOOK_on(sv) (SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
#define SvVALID_on(sv) (SvFLAGS(sv) |= SVpbm_VALID)
#define SvVALID_off(sv) (SvFLAGS(sv) &= ~SVpbm_VALID)
-#define SvMULTI(sv) (SvFLAGS(sv) & SVpgv_MULTI)
-#define SvMULTI_on(sv) (SvFLAGS(sv) |= SVpgv_MULTI)
-#define SvMULTI_off(sv) (SvFLAGS(sv) &= ~SVpgv_MULTI)
-
#define SvRV(sv) ((XRV*) SvANY(sv))->xrv_rv
#define SvRVx(sv) SvRV(sv)
#define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
#define SvIV_set(sv, val) \
- do { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
- (((XPVIV*) SvANY(sv))->xiv_iv = val); } while (0)
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ (((XPVIV*) SvANY(sv))->xiv_iv = val); } STMT_END
#define SvNV_set(sv, val) \
- do { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
- (((XPVNV*) SvANY(sv))->xnv_nv = val); } while (0)
+ STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
+ (((XPVNV*) SvANY(sv))->xnv_nv = val); } STMT_END
#define SvPV_set(sv, val) \
- do { assert(SvTYPE(sv) >= SVt_PV); \
- (((XPV*) SvANY(sv))->xpv_pv = val); } while (0)
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ (((XPV*) SvANY(sv))->xpv_pv = val); } STMT_END
#define SvCUR_set(sv, val) \
- do { assert(SvTYPE(sv) >= SVt_PV); \
- (((XPV*) SvANY(sv))->xpv_cur = val); } while (0)
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ (((XPV*) SvANY(sv))->xpv_cur = val); } STMT_END
#define SvLEN_set(sv, val) \
- do { assert(SvTYPE(sv) >= SVt_PV); \
- (((XPV*) SvANY(sv))->xpv_len = val); } while (0)
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ (((XPV*) SvANY(sv))->xpv_len = val); } STMT_END
#define SvEND_set(sv, val) \
- do { assert(SvTYPE(sv) >= SVt_PV); \
- (((XPV*) SvANY(sv))->xpv_cur = val - SvPVX(sv)); } while (0)
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ (((XPV*) SvANY(sv))->xpv_cur = val - SvPVX(sv)); } STMT_END
#define BmRARE(sv) ((XPVBM*) SvANY(sv))->xbm_rare
#define BmUSEFUL(sv) ((XPVBM*) SvANY(sv))->xbm_useful