X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=op.h;h=746e635d865ee567dbc4c2f2efc4a0fa29a7ec47;hb=acd15b85995cf95382f158dbf237ef9c2ee99b7b;hp=c299c5d40f40939d5220e530581681fa6caa1a98;hpb=a0c21aa16d2e2969e7469365a39ad48179751e84;p=p5sagit%2Fp5-mst-13.2.git diff --git a/op.h b/op.h index c299c5d..746e635 100644 --- a/op.h +++ b/op.h @@ -1,7 +1,7 @@ /* op.h * * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 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. @@ -22,7 +22,17 @@ * 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! + * + * See the comments in S_clear_yystack() for more + * details on the following three flags: + + * op_latefree tell op_free() to clear this op (and free any kids) + * but not yet deallocate the struct. This means that + * the op may be safely op_free()d multiple times + * op_latefreed an op_latefree op has been op_free()d + * op_attached this op (sub)tree has been attached to a CV + * + * op_spare two 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 @@ -54,7 +64,10 @@ unsigned op_type:9; \ unsigned op_opt:1; \ unsigned op_static:1; \ - unsigned op_spare:5; \ + unsigned op_latefree:1; \ + unsigned op_latefreed:1; \ + unsigned op_attached:1; \ + unsigned op_spare:2; \ U8 op_flags; \ U8 op_private; #endif @@ -121,6 +134,8 @@ Deprecated. Use C instead. /* On OP_ENTERWHEN, there's no condition */ /* On OP_BREAK, an implicit break */ /* On OP_SMARTMATCH, an implicit smartmatch */ + /* On OP_ANONHASH and OP_ANONLIST, create a + reference to the new anon hash or array */ /* old names; don't use in new code, but don't break them, either */ #define OPf_LIST OPf_WANT_LIST @@ -352,14 +367,19 @@ struct pmop { #define PMf_GLOBAL 0x0100 /* pattern had a g modifier */ #define PMf_CONTINUE 0x0200 /* don't reset pos() if //g fails */ #define PMf_EVAL 0x0400 /* evaluating replacement as expr */ -#define PMf_LOCALE 0x0800 /* use locale for character types */ -#define PMf_MULTILINE 0x1000 /* assume multiple lines */ -#define PMf_SINGLELINE 0x2000 /* assume single line */ -#define PMf_FOLD 0x4000 /* case insensitivity */ -#define PMf_EXTENDED 0x8000 /* chuck embedded whitespace */ -/* mask of bits stored in regexp->reganch */ -#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED) +/* The following flags have exact equivalents in regcomp.h with the prefix RXf_ + * which are stored in the regexp->extflags member. + */ +#define PMf_LOCALE 0x00800 /* use locale for character types */ +#define PMf_MULTILINE 0x01000 /* assume multiple lines */ +#define PMf_SINGLELINE 0x02000 /* assume single line */ +#define PMf_FOLD 0x04000 /* case insensitivity */ +#define PMf_EXTENDED 0x08000 /* chuck embedded whitespace */ +#define PMf_KEEPCOPY 0x10000 /* copy the string when matching */ + +/* mask of bits that need to be transfered to re->extflags */ +#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY) #ifdef USE_ITHREADS @@ -450,7 +470,8 @@ struct loop { #ifdef USE_ITHREADS # define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix)) -# define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v)) +# define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \ + && GvIN_PAD(v)) # define IS_PADCONST(v) (v && SvREADONLY(v)) # define cSVOPx_sv(v) (cSVOPx(v)->op_sv \ ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ)) @@ -516,6 +537,15 @@ struct loop { #define OA_SCALARREF 7 #define OA_OPTIONAL 8 +/* Op_REFCNT is a reference count at the head of each op tree: needed + * since the tree is shared between threads, and between cloned closure + * copies in the same thread. OP_REFCNT_LOCK/UNLOCK is used when modifying + * this count. + * The same mutex is used to protect the refcounts of the reg_trie_data + * and reg_ac_data structures, which are shared between duplicated + * regexes. + */ + #ifdef USE_ITHREADS # define OP_REFCNT_INIT MUTEX_INIT(&PL_op_mutex) # ifdef PERL_CORE @@ -548,7 +578,8 @@ struct loop { /* no longer used anywhere in core */ #ifndef PERL_CORE -#define cv_ckproto(cv, gv, p) cv_ckproto_len(cv, gv, p, p ? strlen(p) : 0) +#define cv_ckproto(cv, gv, p) \ + cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0) #endif #ifdef USE_REENTRANT_API @@ -591,3 +622,78 @@ struct token { MADPROP* tk_mad; }; #endif + +/* + * Values that can be hold by mad_key : + * ^ unfilled head spot + * , literal , + * ; literal ; (blank if implicit ; at end of block) + * : literal : from ?: or attr list + * + unary + + * ? literal ? from ?: + * ( literal ( + * ) literal ) + * [ literal [ + * ] literal ] + * { literal { + * } literal } + * @ literal @ sigil + * $ literal $ sigil + * * literal * sigil + * ! use is source filtered + * & & or sub + * # whitespace/comment following ; or } + * # $# sigil + * 1 1st ; from for(;;) + * 1 retired protasis + * 2 2nd ; from for(;;) + * 2 retired apodosis + * 3 C-style for list + * a sub or var attributes + * a non-method arrow operator + * A method arrow operator + * A use import args + * b format block + * B retired stub block + * C constant conditional op + * d declarator + * D do block + * e unreached "else" (see C) + * e expression producing E + * E tr/E/R/, /E/ + * f folded constant op + * F peg op for format + * i if/unless modifier + * I if/elsif/unless statement + * K retired kid op + * l last index of array ($#foo) + * L label + * m modifier on regex + * M my assignment slurped into some other operator's target + * n sub or format name + * o current operator/declarator name + * o else/continue + * O generic optimized op + * p peg to hold extra whitespace at statement level + * P peg op for package declaration + * q opening quote + * = quoted material + * Q closing quote + * Q optimized qw// + * r expression producing R + * R tr/E/R/ s/E/R/ + * R assign slurped by split + * s sub signature + * S use import stub (no import) + * S retired sort block + * t unreached "then" (see C) + * U use import op + * v private sv of for loop + * V use version + * w while/until modifier + * W while/for statement + * x optimized qw + * X random thing + * _ whitespace/comments preceding anything else + * ~ =~ operator + */