X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp.h;h=0a9d6c6453ded6599ff004b61c13d51117fd8195;hb=5f0b1d4e7fd69248b5b73a2a2a30a45af5a96c9f;hp=9f80c2944dd9bcf181963b817dd01ca0248f9df9;hpb=748a93069b3d16374a9859d1456065dd3ae11394;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp.h b/pp.h index 9f80c29..0a9d6c6 100644 --- a/pp.h +++ b/pp.h @@ -1,16 +1,20 @@ /* pp.h * - * Copyright (c) 1991-1994, 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. * */ +#ifdef USE_THREADS +#define ARGS thr +#define dARGS struct perl_thread *thr; +#else #define ARGS -#define ARGSproto void #define dARGS -#define PP(s) OP* s(ARGS) dARGS +#endif /* USE_THREADS */ +#define PP(s) OP * s(ARGSproto) #define SP sp #define MARK mark @@ -23,7 +27,8 @@ #define TOPMARK (*markstack_ptr) #define POPMARK (*markstack_ptr--) -#define dSP register SV **sp = stack_sp +#define djSP register SV **sp = stack_sp +#define dSP dTHR; djSP #define dMARK register SV **mark = stack_base + POPMARK #define dORIGMARK I32 origmark = mark - stack_base #define SETORIGMARK origmark = mark - stack_base @@ -55,47 +60,48 @@ #define POPp (SvPVx(POPs, na)) #define POPn (SvNVx(POPs)) #define POPi ((IV)SvIVx(POPs)) +#define POPu ((UV)SvUVx(POPs)) #define POPl ((long)SvIVx(POPs)) #define TOPs (*sp) #define TOPp (SvPV(TOPs, na)) #define TOPn (SvNV(TOPs)) #define TOPi ((IV)SvIV(TOPs)) +#define TOPu ((UV)SvUV(TOPs)) #define TOPl ((long)SvIV(TOPs)) /* Go to some pains in the rare event that we must extend the stack. */ -#define EXTEND(p,n) do { if (stack_max - p < (n)) { \ - sp = stack_grow(sp,p, (int) (n)); \ - } } while (0) +#define EXTEND(p,n) STMT_START { if (stack_max - p < (n)) { \ + sp = stack_grow(sp,p, (int) (n)); \ + } } STMT_END /* Same thing, but update mark register too. */ -#define MEXTEND(p,n) do {if (stack_max - p < (n)) { \ - int markoff = mark - stack_base; \ - sp = stack_grow(sp,p,(int) (n)); \ - mark = stack_base + markoff; \ - } } while (0) +#define MEXTEND(p,n) STMT_START {if (stack_max - p < (n)) { \ + int markoff = mark - stack_base; \ + sp = stack_grow(sp,p,(int) (n)); \ + mark = stack_base + markoff; \ + } } STMT_END #define PUSHs(s) (*++sp = (s)) -#define PUSHTARG do { SvSETMAGIC(TARG); PUSHs(TARG); } while (0) -#define PUSHp(p,l) do { sv_setpvn(TARG, (p), (l)); PUSHTARG; } while (0) -#define PUSHn(n) do { sv_setnv(TARG, (double)(n)); PUSHTARG; } while (0) -#define PUSHi(i) do { sv_setiv(TARG, (IV)(i)); PUSHTARG; } while (0) - -#define XPUSHs(s) do { EXTEND(sp,1); (*++sp = (s)); } while (0) -#define XPUSHTARG do { SvSETMAGIC(TARG); XPUSHs(TARG); } while (0) -#define XPUSHp(p,l) do { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } while (0) -#define XPUSHn(n) do { sv_setnv(TARG, (double)(n)); XPUSHTARG; } while (0) -#define XPUSHi(i) do { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } while (0) +#define PUSHTARG STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END +#define PUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END +#define PUSHn(n) STMT_START { sv_setnv(TARG, (double)(n)); PUSHTARG; } STMT_END +#define PUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END +#define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END + +#define XPUSHs(s) STMT_START { EXTEND(sp,1); (*++sp = (s)); } STMT_END +#define XPUSHTARG STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END +#define XPUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END +#define XPUSHn(n) STMT_START { sv_setnv(TARG, (double)(n)); XPUSHTARG; } STMT_END +#define XPUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } STMT_END +#define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END #define SETs(s) (*sp = s) -#define SETTARG do { SvSETMAGIC(TARG); SETs(TARG); } while (0) -#define SETp(p,l) do { sv_setpvn(TARG, (p), (l)); SETTARG; } while (0) -#define SETn(n) do { sv_setnv(TARG, (double)(n)); SETTARG; } while (0) -#define SETi(i) do { sv_setiv(TARG, (IV)(i)); SETTARG; } while (0) - -#ifdef OVERLOAD -#define SETsv(sv) do { sv_setsv(TARG, (sv)); SETTARG; } while (0) -#endif /* OVERLOAD */ +#define SETTARG STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END +#define SETp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); SETTARG; } STMT_END +#define SETn(n) STMT_START { sv_setnv(TARG, (double)(n)); SETTARG; } STMT_END +#define SETi(i) STMT_START { sv_setiv(TARG, (IV)(i)); SETTARG; } STMT_END +#define SETu(u) STMT_START { sv_setuv(TARG, (UV)(u)); SETTARG; } STMT_END #define dTOPss SV *sv = TOPs #define dPOPss SV *sv = POPs @@ -103,14 +109,35 @@ #define dPOPnv double value = POPn #define dTOPiv IV value = TOPi #define dPOPiv IV value = POPi - -#define dPOPPOPssrl SV *right = POPs; SV *left = POPs -#define dPOPPOPnnrl double right = POPn; double left = POPn -#define dPOPPOPiirl IV right = POPi; IV left = POPi - -#define dPOPTOPssrl SV *right = POPs; SV *left = TOPs -#define dPOPTOPnnrl double right = POPn; double left = TOPn -#define dPOPTOPiirl IV right = POPi; IV left = TOPi +#define dTOPuv UV value = TOPu +#define dPOPuv UV value = POPu + +#define dPOPXssrl(X) SV *right = POPs; SV *left = CAT2(X,s) +#define dPOPXnnrl(X) double right = POPn; double left = CAT2(X,n) +#define dPOPXiirl(X) IV right = POPi; IV left = CAT2(X,i) + +#define USE_LEFT(sv) \ + (SvOK(sv) || SvGMAGICAL(sv) || !(op->op_flags & OPf_STACKED)) +#define dPOPXnnrl_ul(X) \ + double right = POPn; \ + SV *leftsv = CAT2(X,s); \ + double left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0 +#define dPOPXiirl_ul(X) \ + IV right = POPi; \ + SV *leftsv = CAT2(X,s); \ + IV left = USE_LEFT(leftsv) ? SvIV(leftsv) : 0 + +#define dPOPPOPssrl dPOPXssrl(POP) +#define dPOPPOPnnrl dPOPXnnrl(POP) +#define dPOPPOPnnrl_ul dPOPXnnrl_ul(POP) +#define dPOPPOPiirl dPOPXiirl(POP) +#define dPOPPOPiirl_ul dPOPXiirl_ul(POP) + +#define dPOPTOPssrl dPOPXssrl(TOP) +#define dPOPTOPnnrl dPOPXnnrl(TOP) +#define dPOPTOPnnrl_ul dPOPXnnrl_ul(TOP) +#define dPOPTOPiirl dPOPXiirl(TOP) +#define dPOPTOPiirl_ul dPOPXiirl_ul(TOP) #define RETPUSHYES RETURNX(PUSHs(&sv_yes)) #define RETPUSHNO RETURNX(PUSHs(&sv_no)) @@ -123,11 +150,20 @@ #define ARGTARG op->op_targ #define MAXARG op->op_private -#define SWITCHSTACK(f,t) AvFILL(f) = sp - stack_base; \ - stack_base = AvARRAY(t); \ - stack_max = stack_base + AvMAX(t); \ - sp = stack_sp = stack_base + AvFILL(t); \ - stack = t; +#define SWITCHSTACK(f,t) \ + STMT_START { \ + AvFILLp(f) = sp - stack_base; \ + stack_base = AvARRAY(t); \ + stack_max = stack_base + AvMAX(t); \ + sp = stack_sp = stack_base + AvFILLp(t); \ + curstack = t; \ + } STMT_END + +#define EXTEND_MORTAL(n) \ + STMT_START { \ + if (tmps_ix + (n) >= tmps_max) \ + Renew(tmps_stack, tmps_max = tmps_ix + (n) + 1, SV*); \ + } STMT_END #ifdef OVERLOAD @@ -136,7 +172,7 @@ #define AMGf_assign 4 #define AMGf_unary 8 -#define tryAMAGICbinW(meth,assign,set) do { \ +#define tryAMAGICbinW(meth,assign,set) STMT_START { \ if (amagic_generation) { \ SV* tmpsv; \ SV* right= *(sp); SV* left= *(sp-1);\ @@ -148,7 +184,7 @@ SPAGAIN; \ (void)POPs; set(tmpsv); RETURN; } \ } \ - } while (0) + } STMT_END #define tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv) #define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs) @@ -158,7 +194,7 @@ #define AMG_CALLbinL(left,right,meth) \ amagic_call(left,right,CAT2(meth,_amg),AMGf_noright) -#define tryAMAGICunW(meth,set) do { \ +#define tryAMAGICunW(meth,set) STMT_START { \ if (amagic_generation) { \ SV* tmpsv; \ SV* arg= *(sp); \ @@ -167,22 +203,25 @@ SPAGAIN; \ set(tmpsv); RETURN; } \ } \ - } while (0) + } STMT_END -#define tryAMAGICun(meth) tryAMAGICunW(meth,SETsv) +#define tryAMAGICun tryAMAGICunSET #define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs) #define opASSIGN (op->op_flags & OPf_STACKED) +#define SETsv(sv) STMT_START { \ + if (opASSIGN) { sv_setsv(TARG, (sv)); SETTARG; } \ + else SETs(sv); } STMT_END /* newSVsv does not behave as advertised, so we copy missing * information by hand */ -#define RvDEEPCP(rv) do { SV* ref=SvRV(rv); \ +#define RvDEEPCP(rv) STMT_START { SV* ref=SvRV(rv); \ if (SvREFCNT(ref)>1) { \ SvREFCNT_dec(ref); \ SvRV(rv)=AMG_CALLun(rv,copy); \ - } } while (0) + } } STMT_END #else #define tryAMAGICbin(a,b)