X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp.h;h=c36502a03fa3a950a0179d81fe467ff9e9f8d366;hb=80008eb3e450496f17610b8bfc820f627a758a13;hp=c2cf6914ea5e7711d9893963db2cfdace76df8e9;hpb=6e449a3ab1e3bd9d7e138ca681c733e57d4daa49;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp.h b/pp.h index c2cf691..c36502a 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, 2006, 2007, by Larry Wall and others + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, + * 2002, 2003, 2004, 2005, 2006, 2007, 2008 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. @@ -86,7 +86,7 @@ Refetch the stack pointer. Used after a callback. See L. #define dTARG SV *targ #define NORMAL PL_op->op_next -#define DIE return Perl_die +#define DIE Perl_die /* =for apidoc Ams||PUTBACK @@ -226,63 +226,53 @@ C. =for apidoc Am|void|mPUSHs|SV* sv Push an SV onto the stack and mortalizes the SV. The stack must have room -for this element. Does not handle 'set' magic. Does not use C. -See also C and C. +for this element. Does not use C. See also C and C. =for apidoc Am|void|PUSHmortal Push a new mortal SV onto the stack. The stack must have room for this -element. Does not handle 'set' magic. Does not use C. See also -C, C and C. +element. Does not use C. See also C, C and C. =for apidoc Am|void|mPUSHp|char* str|STRLEN len Push a string onto the stack. The stack must have room for this element. -The C indicates the length of the string. Handles 'set' magic. Does -not use C. See also C, C and C. +The C indicates the length of the string. Does not use C. +See also C, C and C. =for apidoc Am|void|mPUSHn|NV nv Push a double onto the stack. The stack must have room for this element. -Handles 'set' magic. Does not use C. See also C, C -and C. +Does not use C. See also C, C and C. =for apidoc Am|void|mPUSHi|IV iv Push an integer onto the stack. The stack must have room for this element. -Handles 'set' magic. Does not use C. See also C, C -and C. +Does not use C. See also C, C and C. =for apidoc Am|void|mPUSHu|UV uv Push an unsigned integer onto the stack. The stack must have room for this -element. Handles 'set' magic. Does not use C. See also C, -C and C. +element. Does not use C. See also C, C and C. =for apidoc Am|void|mXPUSHs|SV* sv Push an SV onto the stack, extending the stack if necessary and mortalizes -the SV. Does not handle 'set' magic. Does not use C. See also -C and C. +the SV. Does not use C. See also C and C. =for apidoc Am|void|XPUSHmortal -Push a new mortal SV onto the stack, extending the stack if necessary. Does -not handle 'set' magic. Does not use C. See also C, -C and C. +Push a new mortal SV onto the stack, extending the stack if necessary. +Does not use C. See also C, C and C. =for apidoc Am|void|mXPUSHp|char* str|STRLEN len Push a string onto the stack, extending the stack if necessary. The C -indicates the length of the string. Handles 'set' magic. Does not use -C. See also C, C and C. +indicates the length of the string. Does not use C. See also C, +C and C. =for apidoc Am|void|mXPUSHn|NV nv -Push a double onto the stack, extending the stack if necessary. Handles -'set' magic. Does not use C. See also C, C and -C. +Push a double onto the stack, extending the stack if necessary. +Does not use C. See also C, C and C. =for apidoc Am|void|mXPUSHi|IV iv -Push an integer onto the stack, extending the stack if necessary. Handles -'set' magic. Does not use C. See also C, C and -C. +Push an integer onto the stack, extending the stack if necessary. +Does not use C. See also C, C and C. =for apidoc Am|void|mXPUSHu|UV uv Push an unsigned integer onto the stack, extending the stack if necessary. -Handles 'set' magic. Does not use C. See also C, C -and C. +Does not use C. See also C, C and C. =cut */ @@ -315,17 +305,17 @@ and C. #define mPUSHs(s) PUSHs(sv_2mortal(s)) #define PUSHmortal PUSHs(sv_newmortal()) -#define mPUSHp(p,l) sv_setpvn_mg(PUSHmortal, (p), (l)) -#define mPUSHn(n) sv_setnv_mg(PUSHmortal, (NV)(n)) -#define mPUSHi(i) sv_setiv_mg(PUSHmortal, (IV)(i)) -#define mPUSHu(u) sv_setuv_mg(PUSHmortal, (UV)(u)) +#define mPUSHp(p,l) PUSHs(newSVpvn_flags((p), (l), SVs_TEMP)) +#define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) +#define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) +#define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) #define mXPUSHs(s) XPUSHs(sv_2mortal(s)) #define XPUSHmortal XPUSHs(sv_newmortal()) -#define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END -#define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END -#define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END -#define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END +#define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); mPUSHp((p), (l)); } STMT_END +#define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END +#define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END +#define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END #define SETs(s) (*sp = s) #define SETTARG STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END @@ -481,6 +471,37 @@ and C. #define tryAMAGICunDEREF_var(meth_enum) \ tryAMAGICunW_var(meth_enum,setAGAIN,0,(void)0) +#define tryAMAGICftest(chr) \ + STMT_START { \ + assert(chr != '?'); \ + if ((PL_op->op_flags & OPf_KIDS) \ + && SvAMAGIC(TOPs)) { \ + const char tmpchr = (chr); \ + SV * const tmpsv = amagic_call(TOPs, \ + newSVpvn_flags(&tmpchr, 1, SVs_TEMP), \ + ftest_amg, AMGf_unary); \ + \ + if (tmpsv) { \ + const OP *next = PL_op->op_next; \ + \ + SPAGAIN; \ + \ + if (next->op_type >= OP_FTRREAD && \ + next->op_type <= OP_FTBINARY && \ + next->op_private & OPpFT_STACKED \ + ) { \ + if (SvTRUE(tmpsv)) \ + /* leave the object alone */ \ + RETURN; \ + } \ + \ + SETs(tmpsv); \ + RETURN; \ + } \ + } \ + } STMT_END + + #define opASSIGN (PL_op->op_flags & OPf_STACKED) #define SETsv(sv) STMT_START { \ if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY)) \ @@ -497,9 +518,9 @@ and C. /* SV* ref causes confusion with the member variable changed SV* ref to SV* tmpRef */ -#define RvDEEPCP(rv) STMT_START { SV* tmpRef=SvRV(rv); \ - if (SvREFCNT(tmpRef)>1) { \ - SvRV_set(rv, AMG_CALLun(rv,copy)); \ +#define RvDEEPCP(rv) STMT_START { SV* tmpRef=SvRV(rv); SV* rv_copy; \ + if (SvREFCNT(tmpRef)>1 && (rv_copy = AMG_CALLun(rv,copy))) { \ + SvRV_set(rv, rv_copy); \ SvREFCNT_dec(tmpRef); \ } } STMT_END @@ -510,6 +531,15 @@ 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()) +#define SvCANEXISTDELETE(sv) \ + (!SvRMAGICAL(sv) \ + || ((mg = mg_find((const SV *) sv, PERL_MAGIC_tied)) \ + && (stash = SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(sv), mg)))) \ + && gv_fetchmethod_autoload(stash, "EXISTS", TRUE) \ + && gv_fetchmethod_autoload(stash, "DELETE", TRUE) \ + ) \ + ) + /* * Local variables: * c-indentation-style: bsd