X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=op.h;h=3a0265587d5b4bf53c603973be0751fb43046b89;hb=7fddc82f0212c2b411408f0a05ebb86f9e431bd9;hp=f25e840fa1df98497acb2297303763a60cd1db7f;hpb=4c79ee7a1e7564ef83d0ac25d6677fdebb3ec7aa;p=p5sagit%2Fp5-mst-13.2.git diff --git a/op.h b/op.h index f25e840..3a02655 100644 --- a/op.h +++ b/op.h @@ -1,6 +1,7 @@ /* op.h * - * Copyright (c) 1991-2003, Larry Wall + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + * 2000, 2001, 2002, 2003, 2004, 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. @@ -16,6 +17,12 @@ * parent takes over role of remembering starting op.) * op_ppaddr Pointer to current ppcode's function. * op_type The type of the operation. + * op_opt Whether or not the op has been optimised by the + * peephole optimiser. + * op_static Whether or not the op is statically defined. + * This flag is used by the B::C compiler backend + * and indicates that the op should not be freed. + * op_spare Five spare bits! * op_flags Flags common to all operations. See OPf_* below. * op_private Flags peculiar to a particular operation (BUT, * by default, set to the number of children until @@ -37,8 +44,10 @@ OP* op_sibling; \ OP* (CPERLscope(*op_ppaddr))(pTHX); \ PADOFFSET op_targ; \ - OPCODE op_type; \ - U16 op_seq; \ + unsigned op_type:9; \ + unsigned op_opt:1; \ + unsigned op_static:1; \ + unsigned op_spare:5; \ U8 op_flags; \ U8 op_private; #endif @@ -99,6 +108,7 @@ Deprecated. Use C instead. /* On RV2[SG]V, don't create GV--in defined()*/ /* On OP_DBSTATE, indicates breakpoint * (runtime property) */ + /* On OP_AELEMFAST, indiciates pad var */ /* old names; don't use in new code, but don't break them, either */ #define OPf_LIST OPf_WANT_LIST @@ -134,15 +144,17 @@ Deprecated. Use C instead. #define OPpTRANS_TO_UTF 2 #define OPpTRANS_IDENTICAL 4 /* right side is same as left */ #define OPpTRANS_SQUASH 8 -#define OPpTRANS_DELETE 16 + /* 16 is used for OPpTARGET_MY */ #define OPpTRANS_COMPLEMENT 32 #define OPpTRANS_GROWS 64 +#define OPpTRANS_DELETE 128 +#define OPpTRANS_ALL (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE) /* Private for OP_REPEAT */ #define OPpREPEAT_DOLIST 64 /* List replication. */ -/* Private for OP_RV2?V, OP_?ELEM */ -#define OPpDEREF (32|64) /* Want ref to something: */ +/* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */ +#define OPpDEREF (32|64) /* autovivify: Want ref to something: */ #define OPpDEREF_AV 32 /* Want ref to AV. */ #define OPpDEREF_HV 64 /* Want ref to HV. */ #define OPpDEREF_SV (32|64) /* Want ref to SV. */ @@ -158,7 +170,7 @@ Deprecated. Use C instead. #define OPpEARLY_CV 32 /* foo() called before sub foo was parsed */ /* OP_?ELEM only */ #define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */ - /* OP_RV2?V, OP_GVSV only */ + /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */ #define OPpOUR_INTRO 16 /* Variable was in an our() */ /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */ #define OPpMAYBE_LVSUB 8 /* We might be an lvalue to return */ @@ -169,6 +181,7 @@ Deprecated. Use C instead. #define OPpTARGET_MY 16 /* Target is PADMY. */ /* Private for OP_CONST */ +#define OPpCONST_SHORTCIRCUIT 4 /* eg the constant 5 in (5 || foo) */ #define OPpCONST_STRICT 8 /* bearword subject to strict 'subs' */ #define OPpCONST_ENTERED 16 /* Has been entered as symbol. */ #define OPpCONST_ARYBASE 32 /* Was a $[ translated to constant. */ @@ -191,6 +204,7 @@ Deprecated. Use C instead. #define OPpSORT_NUMERIC 1 /* Optimized away { $a <=> $b } */ #define OPpSORT_INTEGER 2 /* Ditto while under "use integer" */ #define OPpSORT_REVERSE 4 /* Descending sort */ +#define OPpSORT_INPLACE 8 /* sort in-place; eg @a = sort @a */ /* Private for OP_THREADSV */ #define OPpDONE_SVREF 64 /* Been through newSVREF once */ @@ -204,6 +218,20 @@ Deprecated. Use C instead. #define OPpHUSH_VMSISH 64 /* hush DCL exit msg vmsish mode*/ #define OPpEXIT_VMSISH 128 /* exit(0) vs. exit(1) vmsish mode*/ +/* Private of OP_FTXXX */ +#define OPpFT_ACCESS 2 /* use filetest 'access' */ +#define OPpFT_STACKED 4 /* stacked filetest, as in "-f -x $f" */ +#define OP_IS_FILETEST_ACCESS(op) \ + (((op)->op_type) == OP_FTRREAD || \ + ((op)->op_type) == OP_FTRWRITE || \ + ((op)->op_type) == OP_FTREXEC || \ + ((op)->op_type) == OP_FTEREAD || \ + ((op)->op_type) == OP_FTEWRITE || \ + ((op)->op_type) == OP_FTEEXEC) + +/* Private for OP_(MAP|GREP)(WHILE|START) */ +#define OPpGREP_LEX 2 /* iterate over lexical $_ */ + struct op { BASEOP }; @@ -472,3 +500,15 @@ struct loop { #include "reentr.h" #endif +#if defined(PL_OP_SLAB_ALLOC) +#define NewOp(m,var,c,type) \ + (var = (type *) Perl_Slab_Alloc(aTHX_ m,c*sizeof(type))) +#define NewOpSz(m,var,size) \ + (var = (OP *) Perl_Slab_Alloc(aTHX_ m,size)) +#define FreeOp(p) Perl_Slab_Free(aTHX_ p) +#else +#define NewOp(m, var, c, type) Newz(m, var, c, type) +#define NewOpSz(m, var, size) \ + (var = (OP*)safemalloc(size), memzero(var, size)) +#define FreeOp(p) Safefree(p) +#endif