X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=op.h;h=0cc6be75d27458b6745de2e8df4e2954564c9a98;hb=a3df0bea97cec95963f67c165dcf0364183dd467;hp=f3ef541f8084c21cd0d7355a06000c2fda654b94;hpb=748a93069b3d16374a9859d1456065dd3ae11394;p=p5sagit%2Fp5-mst-13.2.git diff --git a/op.h b/op.h index f3ef541..0cc6be7 100644 --- a/op.h +++ b/op.h @@ -1,6 +1,6 @@ /* op.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. @@ -23,9 +23,10 @@ * which may or may not check number of children). */ -typedef U16 PADOFFSET; +typedef U32 PADOFFSET; +#define NOT_IN_PAD ((PADOFFSET) -1) -#ifdef DEBUGGING +#ifdef DEBUGGING_OPS #define OPCODE opcode #else #define OPCODE U16 @@ -34,18 +35,27 @@ typedef U16 PADOFFSET; #define BASEOP \ OP* op_next; \ OP* op_sibling; \ - OP* (*op_ppaddr)(); \ + OP* (CPERLscope(*op_ppaddr))_((ARGSproto)); \ PADOFFSET op_targ; \ OPCODE op_type; \ U16 op_seq; \ U8 op_flags; \ U8 op_private; -#define GIMME (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : cxstack[cxstack_ix].blk_gimme & G_ARRAY) +#define OP_GIMME(op,dfl) \ + (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID ? G_VOID : \ + ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \ + ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST ? G_ARRAY : \ + dfl) + +#define GIMME_V OP_GIMME(op, block_gimme()) /* Public flags */ -#define OPf_LIST 1 /* Do operator in list context. */ -#define OPf_KNOW 2 /* Context is known. */ + +#define OPf_WANT 3 /* Mask for "want" bits: */ +#define OPf_WANT_VOID 1 /* Want nothing */ +#define OPf_WANT_SCALAR 2 /* Want single value */ +#define OPf_WANT_LIST 3 /* Want list of any length */ #define OPf_KIDS 4 /* There is a firstborn child. */ #define OPf_PARENS 8 /* This operator was parenthesized. */ /* (Or block needs explicit scope entry.) */ @@ -63,6 +73,14 @@ typedef U16 PADOFFSET; /* On flipflop, we saw ... instead of .. */ /* On UNOPs, saw bare parens, e.g. eof(). */ /* On OP_ENTERSUB || OP_NULL, saw a "do". */ + /* On OP_(ENTER|LEAVE)EVAL, don't clear $@ */ + /* On OP_ENTERITER, loop var is per-thread */ + +/* old names; don't use in new code, but don't break them, either */ +#define OPf_LIST 1 +#define OPf_KNOW 2 +#define GIMME \ + (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : dowantarray()) /* Private for lvalues */ #define OPpLVAL_INTRO 128 /* Lvalue must be localized */ @@ -73,7 +91,11 @@ typedef U16 PADOFFSET; /* Private for OP_SASSIGN */ #define OPpASSIGN_BACKWARDS 64 /* Left & right switched. */ +/* Private for OP_MATCH and OP_SUBST{,CONST} */ +#define OPpRUNTIME 64 /* Pattern coming in on the stack */ + /* Private for OP_TRANS */ +#define OPpTRANS_COUNTONLY 8 #define OPpTRANS_SQUASH 16 #define OPpTRANS_DELETE 32 #define OPpTRANS_COMPLEMENT 64 @@ -82,10 +104,16 @@ typedef U16 PADOFFSET; #define OPpREPEAT_DOLIST 64 /* List replication. */ /* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */ - /* (lower bits carry hints) */ -#define OPpDEREF_DB 16 /* Debug subroutine. */ -#define OPpDEREF_AV 32 /* Want ref to AV. */ -#define OPpDEREF_HV 64 /* Want ref to HV. */ +#define OPpDEREF (32|64) /* 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. */ + /* OP_ENTERSUB only */ +#define OPpENTERSUB_DB 16 /* Debug subroutine. */ +#define OPpENTERSUB_AMPER 8 /* Used & form to call. */ + /* OP_?ELEM only */ +#define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */ + /* for OP_RV2?V, lower bits carry hints */ /* Private for OP_CONST */ #define OPpCONST_ENTERED 16 /* Has been entered as symbol. */ @@ -98,8 +126,14 @@ typedef U16 PADOFFSET; /* Private for OP_LIST */ #define OPpLIST_GUESSED 64 /* Guessed that pushmark was needed. */ -/* Private for OP_LEAVE and friends */ -#define OPpLEAVE_VOID 64 /* No need to copy out values. */ +/* Private for OP_DELETE */ +#define OPpSLICE 64 /* Operating on a list of keys */ + +/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */ +#define OPpLOCALE 64 /* Use locale */ + +/* Private for OP_THREADSV */ +#define OPpDONE_SVREF 64 /* Been through newSVREF once */ struct op { BASEOP @@ -145,26 +179,28 @@ struct pmop { OP * op_pmreplstart; PMOP * op_pmnext; /* list of all scanpats */ REGEXP * op_pmregexp; /* compiled expression */ - SV * op_pmshort; /* for a fast bypass of execute() */ U16 op_pmflags; - char op_pmslen; + U16 op_pmpermflags; + U8 op_pmdynflags; }; -#define PMf_USED 0x0001 /* pm has been used once already */ +#define PMdf_USED 0x01 /* pm has been used once already */ + +#define PMf_TAINTMEM 0x0001 /* taint $1 etc. if target tainted */ #define PMf_ONCE 0x0002 /* use pattern only once per reset */ -#define PMf_SCANFIRST 0x0004 /* initial constant not anchored */ -#define PMf_ALL 0x0008 /* initial constant is whole pat */ +#define PMf_REVERSED 0x0004 /* Should be matched right->left */ +/*#define PMf_ALL 0x0008*/ /* initial constant is whole pat */ #define PMf_SKIPWHITE 0x0010 /* skip leading whitespace for split */ #define PMf_FOLD 0x0020 /* case insensitivity */ #define PMf_CONST 0x0040 /* subst replacement is constant */ #define PMf_KEEP 0x0080 /* keep 1st runtime pattern forever */ #define PMf_GLOBAL 0x0100 /* pattern had a g modifier */ -#define PMf_RUNTIME 0x0200 /* pattern coming in on the stack */ +#define PMf_CONTINUE 0x0200 /* don't reset pos() if //g fails */ #define PMf_EVAL 0x0400 /* evaluating replacement as expr */ #define PMf_WHITE 0x0800 /* pattern is \s+ */ #define PMf_MULTILINE 0x1000 /* assume multiple lines */ #define PMf_SINGLELINE 0x2000 /* assume single line */ -#define PMf_UNUSED 0x4000 /* (unused) */ +#define PMf_LOCALE 0x4000 /* use locale for character types */ #define PMf_EXTENDED 0x8000 /* chuck embedded whitespace */ struct svop { @@ -182,12 +218,6 @@ struct pvop { char * op_pv; }; -struct cvop { - BASEOP - CV * op_cv; - OP * op_cont; -}; - struct loop { BASEOP OP * op_first; @@ -207,10 +237,22 @@ struct loop { #define cSVOP ((SVOP*)op) #define cGVOP ((GVOP*)op) #define cPVOP ((PVOP*)op) -#define cCVOP ((CVOP*)op) #define cCOP ((COP*)op) #define cLOOP ((LOOP*)op) +#define cUNOPo ((UNOP*)o) +#define cBINOPo ((BINOP*)o) +#define cLISTOPo ((LISTOP*)o) +#define cLOGOPo ((LOGOP*)o) +#define cCONDOPo ((CONDOP*)o) +#define cPMOPo ((PMOP*)o) +#define cSVOPo ((SVOP*)o) +#define cGVOPo ((GVOP*)o) +#define cPVOPo ((PVOP*)o) +#define cCVOPo ((CVOP*)o) +#define cCOPo ((COP*)o) +#define cLOOPo ((LOOP*)o) + #define kUNOP ((UNOP*)kid) #define kBINOP ((BINOP*)kid) #define kLISTOP ((LISTOP*)kid) @@ -220,7 +262,6 @@ struct loop { #define kSVOP ((SVOP*)kid) #define kGVOP ((GVOP*)kid) #define kPVOP ((PVOP*)kid) -#define kCVOP ((CVOP*)kid) #define kCOP ((COP*)kid) #define kLOOP ((LOOP*)kid) @@ -236,7 +277,26 @@ struct loop { #define OA_DANGEROUS 64 #define OA_DEFGV 128 -#define OASHIFT 8 +/* The next 4 bits encode op class information */ +#define OA_CLASS_MASK (15 << 8) + +#define OA_BASEOP (0 << 8) +#define OA_UNOP (1 << 8) +#define OA_BINOP (2 << 8) +#define OA_LOGOP (3 << 8) +#define OA_CONDOP (4 << 8) +#define OA_LISTOP (5 << 8) +#define OA_PMOP (6 << 8) +#define OA_SVOP (7 << 8) +#define OA_GVOP (8 << 8) +#define OA_PVOP (9 << 8) +#define OA_LOOP (10 << 8) +#define OA_COP (11 << 8) +#define OA_BASEOP_OR_UNOP (12 << 8) +#define OA_FILESTATOP (13 << 8) +#define OA_LOOPEXOP (14 << 8) + +#define OASHIFT 12 /* Remaining nybbles of opargs */ #define OA_SCALAR 1