X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/b162af07ec759e1ba6b84569e4963bc5c289d75f..17ab79462074d95168fb4cd137197d4e6a0696b2:/pp.h diff --git a/pp.h b/pp.h index 221ea89..1f0820a 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. @@ -68,8 +68,7 @@ Refetch the stack pointer. Used after a callback. See L. #define dSP register SV **sp = PL_stack_sp #define djSP dSP #define dMARK register SV **mark = PL_stack_base + POPMARK -#define dORIGMARK I32 origmark = mark - PL_stack_base -#define SETORIGMARK origmark = mark - PL_stack_base +#define dORIGMARK const I32 origmark = mark - PL_stack_base #define ORIGMARK (PL_stack_base + origmark) #define SPAGAIN sp = PL_stack_sp @@ -88,7 +87,6 @@ Refetch the stack pointer. Used after a callback. See L. #define NORMAL PL_op->op_next #define DIE return Perl_die -#define DIE_NULL return DieNull /* =for apidoc Ams||PUTBACK @@ -99,16 +97,13 @@ See C and L for other uses. Pops an SV off the stack. =for apidoc Amn|char*|POPp -Pops a string off the stack. Deprecated. New code should provide -a STRLEN n_a and use POPpx. +Pops a string off the stack. Deprecated. New code should use POPpx. =for apidoc Amn|char*|POPpx Pops a string off the stack. -Requires a variable STRLEN n_a in scope. =for apidoc Amn|char*|POPpbytex Pops a string off the stack which must consist of bytes i.e. characters < 256. -Requires a variable STRLEN n_a in scope. =for apidoc Amn|NV|POPn Pops a double off the stack. @@ -123,14 +118,15 @@ 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 */ -#define POPpx (SvPVx(POPs, n_a)) -#define POPpbytex (SvPVbytex(POPs, n_a)) +#define POPpx (SvPVx_nolen(POPs)) +#define POPpconstx (SvPVx_nolen_const(POPs)) +#define POPpbytex (SvPVbytex_nolen(POPs)) #define POPn (SvNVx(POPs)) #define POPi ((IV)SvIVx(POPs)) #define POPu ((UV)SvUVx(POPs)) @@ -145,7 +141,7 @@ Pops a long off the stack. #define TOPm1s (*(sp-1)) #define TOPp1s (*(sp+1)) #define TOPp (SvPV(TOPs, PL_na)) /* deprecated */ -#define TOPpx (SvPV(TOPs, n_a)) +#define TOPpx (SvPV_nolen(TOPs)) #define TOPn (SvNV(TOPs)) #define TOPi ((IV)SvIV(TOPs)) #define TOPu ((UV)SvUV(TOPs)) @@ -286,8 +282,8 @@ and C. } } STMT_END /* Same thing, but update mark register too. */ -#define MEXTEND(p,n) STMT_START {if (PL_stack_max - p < (int)(n)) { \ - int markoff = mark - PL_stack_base; \ +#define MEXTEND(p,n) STMT_START {if (PL_stack_max - p < (int)(n)) { \ + const int markoff = mark - PL_stack_base; \ sp = stack_grow(sp,p,(int) (n)); \ mark = PL_stack_base + markoff; \ } } STMT_END @@ -401,44 +397,57 @@ and C. #define AMGf_assign 4 #define AMGf_unary 8 -#define tryAMAGICbinW(meth,assign,set) STMT_START { \ - if (PL_amagic_generation) { \ - SV* tmpsv; \ - SV* right= *(sp); SV* left= *(sp-1);\ - if ((SvAMAGIC(left)||SvAMAGIC(right))&&\ - (tmpsv=amagic_call(left, \ +#define tryAMAGICbinW_var(meth_enum,assign,set) STMT_START { \ + SV* const left = *(sp-1); \ + SV* const right = *(sp); \ + if ((SvAMAGIC(left)||SvAMAGIC(right))) {\ + SV * const tmpsv = amagic_call(left, \ right, \ - CAT2(meth,_amg), \ - (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 tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv) +#define tryAMAGICbinW(meth,assign,set) \ + tryAMAGICbinW_var(CAT2(meth,_amg),assign,set) + +#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 AMG_CALLun(sv,meth) amagic_call(sv,&PL_sv_undef, \ - CAT2(meth,_amg),AMGf_noright | AMGf_unary) +#define tryAMAGICbinSET_var(meth_enum,assign) \ + tryAMAGICbinW_var(meth_enum,assign,SETs) + +#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 */ \ @@ -457,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 { \ @@ -486,3 +497,13 @@ True if this op will be the return value of an lvalue subroutine =cut */ #define LVRET ((PL_op->op_private & OPpMAYBE_LVSUB) && is_lvalue_sub()) + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + * + * ex: set ts=8 sts=4 sw=4 noet: + */