X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp.h;h=463eda7b55491c1a4f1f6600932042fe7528015f;hb=43cde5e1e83b30bf5686de126e495824ad2a47d9;hp=21d3c9d8679e1214df0f5843d35a951251d3f64f;hpb=eb87d5ef4f3abe7f9c4c2c1f62f9acb7cae8b335;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp.h b/pp.h index 21d3c9d..463eda7 100644 --- a/pp.h +++ b/pp.h @@ -1,7 +1,7 @@ /* pp.h * * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others + * 2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -59,16 +59,16 @@ Refetch the stack pointer. Used after a callback. See L. STMT_START { \ if (++PL_markstack_ptr == PL_markstack_max) \ markstack_grow(); \ - *PL_markstack_ptr = (p) - PL_stack_base; \ + *PL_markstack_ptr = (I32)((p) - PL_stack_base);\ } STMT_END #define TOPMARK (*PL_markstack_ptr) #define POPMARK (*PL_markstack_ptr--) -#define dSP register SV **sp = PL_stack_sp +#define dSP SV **sp = PL_stack_sp #define djSP dSP #define dMARK register SV **mark = PL_stack_base + POPMARK -#define dORIGMARK const I32 origmark = mark - PL_stack_base +#define dORIGMARK const I32 origmark = (I32)(mark - PL_stack_base) #define ORIGMARK (PL_stack_base + origmark) #define SPAGAIN sp = PL_stack_sp @@ -118,9 +118,9 @@ Pops a long off the stack. */ #define PUTBACK PL_stack_sp = sp -#define RETURN return PUTBACK, NORMAL -#define RETURNOP(o) return PUTBACK, o -#define RETURNX(x) return x, PUTBACK, NORMAL +#define RETURN return (PUTBACK, NORMAL) +#define RETURNOP(o) return (PUTBACK, o) +#define RETURNX(x) return (x, PUTBACK, NORMAL) #define POPs (*sp--) #define POPp (SvPVx(POPs, PL_na)) /* deprecated */ @@ -398,49 +398,56 @@ and C. #define AMGf_unary 8 #define tryAMAGICbinW_var(meth_enum,assign,set) STMT_START { \ - if (PL_amagic_generation) { \ - SV* tmpsv; \ - SV* const right= *(sp); SV* const left= *(sp-1);\ - if ((SvAMAGIC(left)||SvAMAGIC(right))&&\ - (tmpsv=amagic_call(left, \ + SV* const left = *(sp-1); \ + SV* const right = *(sp); \ + if ((SvAMAGIC(left)||SvAMAGIC(right))) {\ + SV * const tmpsv = amagic_call(left, \ right, \ - meth_enum, \ - (assign)? AMGf_assign: 0))) {\ - SPAGAIN; \ - (void)POPs; set(tmpsv); RETURN; } \ - } \ + (meth_enum), \ + (assign)? AMGf_assign: 0); \ + if (tmpsv) { \ + SPAGAIN; \ + (void)POPs; set(tmpsv); RETURN; } \ + } \ } STMT_END #define tryAMAGICbinW(meth,assign,set) \ tryAMAGICbinW_var(CAT2(meth,_amg),assign,set) -#define tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv) +#define tryAMAGICbin_var(meth_enum,assign) \ + tryAMAGICbinW_var(meth_enum,assign,SETsv) +#define tryAMAGICbin(meth,assign) \ + tryAMAGICbin_var(CAT2(meth,_amg),assign) + #define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs) #define tryAMAGICbinSET_var(meth_enum,assign) \ tryAMAGICbinW_var(meth_enum,assign,SETs) -#define AMG_CALLun(sv,meth) amagic_call(sv,&PL_sv_undef, \ - CAT2(meth,_amg),AMGf_noright | AMGf_unary) +#define AMG_CALLun_var(sv,meth_enum) amagic_call(sv,&PL_sv_undef, \ + meth_enum,AMGf_noright | AMGf_unary) +#define AMG_CALLun(sv,meth) AMG_CALLun_var(sv,CAT2(meth,_amg)) + #define AMG_CALLbinL(left,right,meth) \ amagic_call(left,right,CAT2(meth,_amg),AMGf_noright) -#define tryAMAGICunW(meth,set,shift,ret) STMT_START { \ - if (PL_amagic_generation) { \ +#define tryAMAGICunW_var(meth_enum,set,shift,ret) STMT_START { \ SV* tmpsv; \ SV* arg= sp[shift]; \ if(0) goto am_again; /* shut up unused warning */ \ am_again: \ if ((SvAMAGIC(arg))&&\ - (tmpsv=AMG_CALLun(arg,meth))) {\ + (tmpsv=AMG_CALLun_var(arg,(meth_enum)))) {\ SPAGAIN; if (shift) sp += shift; \ set(tmpsv); ret; } \ - } \ } STMT_END +#define tryAMAGICunW(meth,set,shift,ret) \ + tryAMAGICunW_var(CAT2(meth,_amg),set,shift,ret) #define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END -#define tryAMAGICun(meth) tryAMAGICunW(meth,SETsvUN,0,RETURN) +#define tryAMAGICun_var(meth_enum) tryAMAGICunW_var(meth_enum,SETsvUN,0,RETURN) +#define tryAMAGICun(meth) tryAMAGICun_var(CAT2(meth,_amg)) #define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs,0,RETURN) #define tryAMAGICunTARGET(meth, shift) \ STMT_START { dSP; sp--; /* get TARGET from below PL_stack_sp */ \ @@ -459,6 +466,8 @@ and C. } STMT_END #define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0) +#define tryAMAGICunDEREF_var(meth_enum) \ + tryAMAGICunW_var(meth_enum,setAGAIN,0,(void)0) #define opASSIGN (PL_op->op_flags & OPf_STACKED) #define SETsv(sv) STMT_START { \