This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
0122863dda65ff912315db132c85356636e35e7f
[perl5.git] / regen / op_private
1 #!perl
2
3 =head1 F<regen/op_private>
4
5 This file contains all the definitions of the meanings of the flags in the
6 op_private field of an OP.
7
8 After editing this file, run C<make regen>. This will generate/update data
9 in:
10
11     opcode.h
12     lib/B/Op_private.pm
13
14 C<B::Op_private> holds three global hashes, C<%bits>, C<%defines>,
15 C<%labels>, which hold roughly the same information as found in this file
16 (after processing).
17
18 F<opcode.h> gains a series of C<OPp*> defines, and a few static data
19 structures:
20
21 C<PL_op_private_valid> defines, per-op, which op_private bits are legally
22 allowed to be set. This is a good first place to look to see if an op has
23 any spare private bits.
24
25 C<PL_op_private_bitdef_ix>, C<PL_op_private_bitdefs>,
26 C<PL_op_private_labels>, C<PL_op_private_bitfields>,
27 C<PL_op_private_valid> contain (in a compact form) the data needed by
28 Perl_do_op_dump() to dump the op_private field of an op.
29
30 This file actually contains perl code which is run by F<regen/opcode.pl>.
31 The basic idea is that you keep calling addbits() to add definitions of
32 what a particular bit or range of bits in op_private means for a
33 particular op. This can be specified either as a 1-bit flag or a 1-or-more
34 bit bit field. Here's a general example:
35
36     addbits('aelem',
37             7 => qw(OPpLVAL_INTRO LVINTRO),
38             6 => qw(OPpLVAL_DEFER LVDEFER),
39        '4..5' =>  {
40                        mask_def  => 'OPpDEREF',
41                        enum => [ qw(
42                                    1   OPpDEREF_AV   DREFAV
43                                    2   OPpDEREF_HV   DREFHV
44                                    3   OPpDEREF_SV   DREFSV
45                                )],
46                    },
47     );
48
49 Here for the op C<aelem>, bits 6 and 7 (bits are numbered 0..7) are
50 defined as single-bit flags. The first string following the bit number is
51 the define name that gets emitted in F<opcode.h>, and the second string is
52 the label, which will be displayed by F<Concise.pm> and Perl_do_op_dump()
53 (as used by C<perl -Dx>).
54
55 If the bit number is actually two numbers connected with '..', then this
56 defines a bit field, which is 1 or more bits taken to hold a small
57 unsigned integer. Instead of two string arguments, it just has a single
58 hash ref argument. A bit field allows you to generate extra defines, such
59 as a mask, and optionally allows you to define an enumeration, where a
60 subset of the possible values of the bit field are given their own defines
61 and labels. The full syntax of this hash is explained further below.
62
63 Note that not all bits for a particular op need to be added in a single
64 addbits() call; they accumulate. In particular, this file is arranged in
65 two halves; first, generic flags shared by multiple ops are added, then
66 in the second half, specific per-op flags are added, e.g.
67
68    addbits($_, 7 => qw(OPpLVAL_INTRO LVINTRO)) for qw(pos substr vec  ...);
69
70    ....
71    
72    addbits('substr',
73                4 => qw(OPpSUBSTR_REPL_FIRST REPL1ST),
74                3 => ...
75            );
76
77 (although the dividing line between these two halves is somewhat
78 subjective, and is based on whether "OPp" is followed by the op name or
79 something generic).
80
81 There are some utility functions for generating a list of ops from
82 F<regen/opcodes> based on various criteria. These are:
83
84     ops_with_check('ck_foo')
85     ops_with_flag('X')
86     ops_with_arg(N, 'XYZ')
87
88 which respectively return a list of op names where:
89
90     field 3 of regen/opcodes specifies 'ck_foo' as the check function;
91     field 4 of of regen/opcodes has flag or type 'X' set;
92     argument field N of of regen/opcodes matches 'XYZ';
93
94 For example
95
96     addbits($_, 4 => qw(OPpTARGET_MY TARGMY)) for ops_with_flag('T');
97
98 If a label is specified as '-', then the flag or bit field is not
99 displayed symbolically by Concise/-Dx; instead the bits are treated as
100 unrecognised and are included in the final residual integer value after
101 all recognised bits have been processed (this doesn't apply to individual
102 enum labels).
103
104 Here is a full example of a bit field hash:
105
106     '5..6' =>  {
107         mask_def      => 'OPpFOO_MASK',
108         baseshift_def => 'OPpFOO_SHIFT',
109         bitcount_def  => 'OPpFOO_BITS',
110         label         => 'FOO',
111         enum          => [ qw(
112                              1   OPpFOO_A  A
113                              2   OPpFOO_B  B
114                              3   OPpFOO_C  C
115                          )],
116     };
117
118 The optional C<*_def> keys cause defines to be emitted that specify
119 useful values based on the bit range (5 to 6 in this case):
120
121     mask_def:      a mask that will extract the bit field
122     baseshift_def: how much to shift to make the bit field reach bit 0
123     bitcount_def:  how many bits make up the bit field
124
125 The example above will generate
126
127     #define OPpFOO_MASK 0x60
128     #define OPpFOO_SHIFT   5
129     #define OPpFOO_BITS    2
130
131 The optional enum list specifies a set of defines and labels for (possibly
132 a subset of) the possible values of the bit field (which in this example
133 are 0,1,2,3). If a particular value matches an enum, then it will be
134 displayed symbolically (e.g. 'C'), otherwise as a small integer. The
135 defines are suitably shifted. The example above will generate
136
137     #define OPpFOO_A 0x20
138     #define OPpFOO_B 0x40
139     #define OPpFOO_C 0x60
140
141 So you can write code like
142
143     if ((o->op_private & OPpFOO_MASK) == OPpFOO_C) ...
144
145 The optional 'label' key causes Concise/-Dx output to prefix the value
146 with C<LABEL=>; so in this case it might display C<FOO=C>.  If the field
147 value is zero, and if no label is present, and if no enum matches, then
148 the field isn't displayed.
149
150 =cut
151
152
153 use warnings;
154 use strict;
155
156
157
158
159 # ====================================================================
160 #
161 # GENERIC OPpFOO flags
162 #
163 # Flags where FOO is a generic term (like LVAL), and the flag is
164 # shared between multiple (possibly unrelated) ops.
165
166
167
168
169 {
170     # The lower few bits of op_private often indicate the number of
171     # arguments. This is usually set by newUNOP() and newLOGOP (to 1),
172     # by newBINOP() (to 1 or 2), and by ck_fun() (to 1..15).
173     #
174     # These values are sometimes used at runtime: in particular,
175     # the MAXARG macro extracts out the lower 4 bits.
176     #
177     # Some ops encroach upon these bits; for example, entersub is a unop,
178     # but uses bit 0 for something else. Bit 0 is initially set to 1 in
179     # newUNOP(), but is later cleared (in ck_rvconst()), when the code
180     # notices that this op is an entersub.
181     #
182     # The important thing below is that any ops which use MAXARG at
183     # runtime must have all 4 bits allocated; if bit 3 were used for a new
184     # flag say, then things could break.  The information on the other
185     # types of op is for completeness (so we can account for every bit
186     # used in every op)
187
188     my (%maxarg, %args0, %args1, %args2, %args3, %args4);
189
190     # these are the functions which currently use MAXARG at runtime
191     # (i.e. in the pp() functions). Thus they must always have 4 bits
192     # allocated
193     $maxarg{$_} = 1 for qw(
194         binmode bless caller chdir close enterwrite eof exit fileno getc
195         getpgrp gmtime index mkdir rand reset setpgrp sleep srand sysopen
196         tell umask
197     );
198
199     # find which ops use 0,1,2,3 or 4 bits of op_private for arg count info
200
201     $args0{$_} = 1 for qw(entersub avhvswitch
202                        rv2hv);                  # UNOPs that usurp bit 0
203
204     $args1{$_} = 1 for (
205                         qw(reverse), # ck_fun(), but most bits stolen
206                         qw(mapstart grepstart), # set in ck_fun, but
207                                                 # cleared in ck_grep,
208                                                 # unless there is an error
209                         grep !$maxarg{$_} && !$args0{$_},
210                             ops_with_flag('1'), # UNOP
211                             ops_with_flag('+'), # UNOP_AUX
212                             ops_with_flag('%'), # BASEOP/UNOP
213                             ops_with_flag('|'), # LOGOP
214                             ops_with_flag('-'), # FILESTATOP
215                             ops_with_flag('}'), # LOOPEXOP
216                             ops_with_flag('.'), # METHOP
217                     );
218
219     $args2{$_} = 1 for (
220                         qw(vec),
221                         grep !$maxarg{$_} && !$args0{$_} && !$args1{$_},
222                             ops_with_flag('2'), # BINOP
223                             # this is a binop, but special-cased as a
224                             # baseop in regen/opcodes
225                             'sassign',
226                     );
227
228     $args3{$_} = 1 for grep !$maxarg{$_} && !$args0{$_}
229                                             && !$args1{$_} && !$args2{$_},
230                             # substr starts off with 4 bits set in
231                             # ck_fun(), but since it never has more than 7
232                             # args, bit 3 is later stolen
233                             qw(substr);
234
235     $args4{$_} = 1 for  keys %maxarg,
236                         grep !$args0{$_} && !$args1{$_}
237                                                 && !$args2{$_} && !$args3{$_},
238                             ops_with_check('ck_fun'),
239                             # these other ck_*() functions call ck_fun()
240                             ops_with_check('ck_exec'),
241                             ops_with_check('ck_glob'),
242                             ops_with_check('ck_index'),
243                             ops_with_check('ck_join'),
244                             ops_with_check('ck_lfun'),
245                             ops_with_check('ck_open'),
246                             ops_with_check('ck_select'),
247                             ops_with_check('ck_stringify'),
248                             ops_with_check('ck_tell'),
249                             ops_with_check('ck_trunc'),
250                             ;
251
252
253     for (sort keys %args1) {
254         addbits($_, '0..0' => {
255                 mask_def  => 'OPpARG1_MASK',
256                 label     => '-',
257             }
258         );
259     }
260
261     for (sort keys %args2) {
262         addbits($_, '0..1' => {
263                 mask_def  => 'OPpARG2_MASK',
264                 label     => '-',
265             }
266         );
267     }
268
269     for (sort keys %args3) {
270         addbits($_, '0..2' => {
271                 mask_def  => 'OPpARG3_MASK',
272                 label     => '-',
273             }
274         );
275     }
276
277     for (sort keys %args4) {
278         addbits($_, '0..3' => {
279                 mask_def  => 'OPpARG4_MASK',
280                 label     => '-',
281             }
282         );
283     }
284 }
285
286
287
288 # if NATIVE_HINTS is defined, op_private on cops holds the top 8 bits
289 # of PL_hints, although only bits 6 & 7 are officially used for that
290 # purpose (the rest ought to be masked off). Bit 5 is set separately
291
292 for (qw(nextstate dbstate)) {
293     addbits($_,
294         5 => qw(OPpHUSH_VMSISH          HUSH),
295     );
296 }
297
298
299 # op is in local context, or pad variable is being introduced, e.g.
300 #   local $h{foo}
301 #   my $x
302
303 addbits($_, 7 => qw(OPpLVAL_INTRO LVINTRO))
304     for qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice split
305            hslice delete padsv padav padhv enteriter entersub padrange
306            pushmark cond_expr refassign lvref lvrefslice lvavref multideref),
307            'list', # this gets set in my_attrs() for some reason
308            ;
309
310
311
312 # TARGLEX
313 #
314 # in constructs like my $x; ...; $x = $a + $b,
315 # the sassign is optimised away and OPpTARGET_MY is set on the add op
316 #
317 # Note that OPpTARGET_MY is mainly used at compile-time. At run time,
318 # the pp function just updates the SV pointed to by op_targ, and doesn't
319 # care whether that's a PADTMP or a lexical var.
320
321 # Some comments about when its safe to use T/OPpTARGET_MY.
322 #
323 # Safe to set if the ppcode uses:
324 #       tryAMAGICbin, tryAMAGICun, SETn, SETi, SETu, PUSHn, PUSHTARG, SETTARG,
325 #       SETs(TARG), XPUSHn, XPUSHu,
326 # but make sure set-magic is invoked separately for SETs(TARG) (or change
327 # it to SETTARG).
328 #
329 # Unsafe to set if the ppcode uses dTARG or [X]RETPUSH[YES|NO|UNDEF]
330 #
331 # Only the code paths that handle scalar rvalue context matter.  If dTARG
332 # or RETPUSHNO occurs only in list or lvalue paths, T is safe.
333 #
334 # lt and friends do SETs (including ncmp, but not scmp or i_ncmp)
335 #
336 # Additional mode of failure: the opcode can modify TARG before it "used"
337 # all the arguments (or may call an external function which does the same).
338 # If the target coincides with one of the arguments ==> kaboom.
339 #
340 # pp.c  pos substr each not OK (RETPUSHUNDEF)
341 #       ref not OK (RETPUSHNO)
342 #       trans not OK (target is used for lhs, not retval)
343 #       ucfirst etc not OK: TMP arg processed inplace
344 #       quotemeta not OK (unsafe when TARG == arg)
345 #       pack - unknown whether it is safe
346 #       sprintf: is calling do_sprintf(TARG,...) which can act on TARG
347 #         before other args are processed.
348 #
349 #       Suspicious wrt "additional mode of failure" (and only it):
350 #       schop, chop, postinc/dec, bit_and etc, negate, complement.
351 #
352 #       Also suspicious: 4-arg substr, sprintf, uc/lc (POK_only), reverse, pack.
353 #
354 #       substr/vec: doing TAINT_off()???
355 #
356 # pp_hot.c
357 #       readline - unknown whether it is safe
358 #       match subst not OK (dTARG)
359 #       grepwhile not OK (not always setting)
360 #       join not OK (unsafe when TARG == arg)
361 #
362 #       concat - pp_concat special-cases TARG==arg to avoid
363 #               "additional mode of failure"
364 #
365 # pp_ctl.c
366 #       mapwhile flip caller not OK (not always setting)
367 #
368 # pp_sys.c
369 #       backtick glob warn die not OK (not always setting)
370 #       warn not OK (RETPUSHYES)
371 #       open fileno getc sysread syswrite ioctl accept shutdown
372 #        ftsize(etc) readlink telldir fork alarm getlogin not OK (RETPUSHUNDEF)
373 #       umask select not OK (XPUSHs(&PL_sv_undef);)
374 #       fileno getc sysread syswrite tell not OK (meth("FILENO" "GETC"))
375 #       sselect shm* sem* msg* syscall - unknown whether they are safe
376 #       gmtime not OK (list context)
377 #
378 #       Suspicious wrt "additional mode of failure": warn, die, select.
379
380
381 addbits($_, 4 => qw(OPpTARGET_MY TARGMY))
382     for ops_with_flag('T'),
383 ;
384
385
386
387
388
389 # op_targ carries a refcount
390 addbits($_, 6 => qw(OPpREFCOUNTED REFC))
391     for qw(leave leavesub leavesublv leavewrite leaveeval);
392
393
394
395 # Do not copy return value
396 addbits($_, 7 => qw(OPpLVALUE LV)) for qw(leave leaveloop);
397
398
399
400 # autovivify: Want ref to something
401 for (qw(rv2gv rv2sv padsv aelem helem entersub)) {
402     addbits($_, '4..5' => {
403                 mask_def  => 'OPpDEREF',
404                 enum => [ qw(
405                             1   OPpDEREF_AV   DREFAV
406                             2   OPpDEREF_HV   DREFHV
407                             3   OPpDEREF_SV   DREFSV
408                         )],
409             }
410     );
411 }
412
413
414
415 # Defer creation of array/hash elem
416 addbits($_, 6 => qw(OPpLVAL_DEFER LVDEFER)) for qw(aelem helem multideref);
417
418
419
420 addbits($_, 2 => qw(OPpSLICEWARNING SLICEWARN)) # warn about @hash{$scalar}
421     for qw(rv2hv rv2av padav padhv hslice aslice);
422
423
424
425 # XXX Concise seemed to think that OPpOUR_INTRO is used in rv2gv too,
426 # but I can't see it - DAPM
427 addbits($_, 6 => qw(OPpOUR_INTRO OURINTR)) # Variable was in an our()
428     for qw(gvsv rv2sv rv2av rv2hv enteriter split);
429
430
431
432 # We might be an lvalue to return
433 # 'values' doesn't actually use this bit, but we reserve it here as
434 # pp_values may call Perl_do_kv() which is shared among several ops which
435 # do.
436
437 addbits($_, 3 => qw(OPpMAYBE_LVSUB LVSUB))
438     for qw(aassign rv2av rv2gv rv2hv padav padhv aelem helem aslice hslice
439            av2arylen keys akeys avhvswitch kvaslice kvhslice substr pos vec
440            multideref values);
441
442
443
444 for (qw(rv2hv padhv ref)) {
445     addbits($_,                           # e.g. %hash in (%hash || $foo) ...
446         4 => qw(OPpMAYBE_TRUEBOOL BOOL?), # but cx not known till run time
447         5 => qw(OPpTRUEBOOL       BOOL),
448     );
449 }
450 for (qw(grepwhile index length padav pos rindex rv2av subst)) {
451     addbits($_,
452         5 => qw(OPpTRUEBOOL       BOOL),  # if (@a) {...}
453     );
454 }
455
456
457 addbits($_, 1 => qw(OPpHINT_STRICT_REFS STRICT))
458     for qw(rv2sv rv2av rv2hv rv2gv multideref);
459
460
461
462 # Treat caller(1) as caller(2)
463 addbits($_, 7 => qw(OPpOFFBYONE  +1)) for qw(caller wantarray runcv);
464
465
466
467 # label is in UTF8 */
468 addbits($_, 7 => qw(OPpPV_IS_UTF8 UTF)) for qw(last redo next goto dump);
469
470
471
472 # ====================================================================
473 #
474 # OP-SPECIFIC OPpFOO_* flags:
475 #
476 # where FOO is typically the name of an op, and the flag is used by a
477 # single op (or maybe by a few closely related ops).
478
479
480
481 # note that for refassign, this bit can mean either OPpPAD_STATE or
482 # OPpOUR_INTRO depending on the type of the LH child, .e.g.
483 #   \our   $foo = ...
484 #   \state $foo = ...
485
486 addbits($_, 6 => qw(OPpPAD_STATE STATE))  for qw(padav padhv padsv lvavref
487                                                  lvref refassign pushmark);
488
489 # NB: both sassign and aassign use the 'OPpASSIGN' naming convention
490 # for their private flags
491
492 # there *may* be common scalar items on both sides of a list assign:
493 # run-time checking will be needed.
494 addbits('aassign', 6 => qw(OPpASSIGN_COMMON_SCALAR COM_SCALAR));
495 #
496 # as above, but it's possible to check for non-commonality with just
497 # a SvREFCNT(lhs) == 1 test for each lhs element
498 addbits('aassign', 5 => qw(OPpASSIGN_COMMON_RC1 COM_RC1));
499
500 # run-time checking is required for an aggregate on the LHS
501 addbits('aassign', 4 => qw(OPpASSIGN_COMMON_AGG COM_AGG));
502
503 addbits('aassign', 2 => qw(OPpASSIGN_TRUEBOOL BOOL));  # if (@a = (...)) {...}
504
505
506 # NB: both sassign and aassign use the 'OPpASSIGN' naming convention
507 # for their private flags
508
509 addbits('sassign',
510     6 => qw(OPpASSIGN_BACKWARDS BKWARD), # Left & right switched
511     7 => qw(OPpASSIGN_CV_TO_GV  CV2GV),  # Possible optimisation for constants
512 );
513
514
515
516 for (qw(trans transr)) {
517     addbits($_,
518         0 => qw(OPpTRANS_FROM_UTF   <UTF),
519         1 => qw(OPpTRANS_TO_UTF     >UTF),
520         2 => qw(OPpTRANS_IDENTICAL  IDENT),   # right side is same as left
521         3 => qw(OPpTRANS_SQUASH     SQUASH),
522         # 4 is used for OPpTARGET_MY
523         5 => qw(OPpTRANS_COMPLEMENT COMPL),
524         6 => qw(OPpTRANS_GROWS      GROWS),
525         7 => qw(OPpTRANS_DELETE     DEL),
526     );
527 }
528
529
530
531 addbits('repeat', 6 => qw(OPpREPEAT_DOLIST DOLIST)); # List replication
532
533
534
535 # OP_ENTERSUB and OP_RV2CV flags
536 #
537 # Flags are set on entersub and rv2cv in three phases:
538 #   parser  - the parser passes the flag to the op constructor
539 #   check   - the check routine called by the op constructor sets the flag
540 #   context - application of scalar/ref/lvalue context applies the flag
541 #
542 # In the third stage, an entersub op might turn into an rv2cv op (undef &foo,
543 # \&foo, lock &foo, exists &foo, defined &foo).  The two places where that
544 # happens (op_lvalue_flags and doref in op.c) need to make sure the flags do
545 # not conflict, since some flags with different meanings overlap between
546 # the two ops.  Flags applied in the context phase are only set when there
547 # is no conversion of op type.
548 #
549 #   bit  entersub flag       phase   rv2cv flag             phase
550 #   ---  -------------       -----   ----------             -----
551 #     0  OPpENTERSUB_INARGS  context
552 #     1  HINT_STRICT_REFS    check   HINT_STRICT_REFS       check
553 #     2  OPpENTERSUB_HASTARG checki  OPpENTERSUB_HASTARG
554 #     3  OPpENTERSUB_AMPER   check   OPpENTERSUB_AMPER      parser
555 #     4  OPpDEREF_AV         context
556 #     5  OPpDEREF_HV         context OPpMAY_RETURN_CONSTANT parser/context
557 #     6  OPpENTERSUB_DB      check   OPpENTERSUB_DB
558 #     7  OPpLVAL_INTRO       context OPpENTERSUB_NOPAREN    parser
559
560 # NB: OPpHINT_STRICT_REFS must equal HINT_STRICT_REFS
561
562 addbits('entersub',
563     0      => qw(OPpENTERSUB_INARGS   INARGS), # Lval used as arg to a sub
564     1      => qw(OPpHINT_STRICT_REFS  STRICT), # 'use strict' in scope
565     2      => qw(OPpENTERSUB_HASTARG  TARG  ), # Called from OP tree
566     3      => qw(OPpENTERSUB_AMPER    AMPER),  # Used & form to call
567     # 4..5 => OPpDEREF,      already defined above
568     6      => qw(OPpENTERSUB_DB       DBG   ), # Debug subroutine
569     # 7    => OPpLVAL_INTRO, already defined above
570 );
571
572 # note that some of these flags are just left-over from when an entersub
573 # is converted into an rv2cv, and could probably be cleared/re-assigned
574
575 addbits('rv2cv',
576     1 => qw(OPpHINT_STRICT_REFS    STRICT), # 'use strict' in scope
577     2 => qw(OPpENTERSUB_HASTARG    TARG  ), # If const sub, return the const
578     3 => qw(OPpENTERSUB_AMPER      AMPER ), # Used & form to call
579
580     5 => qw(OPpMAY_RETURN_CONSTANT CONST ),
581     6 => qw(OPpENTERSUB_DB         DBG   ), # Debug subroutine
582     7 => qw(OPpENTERSUB_NOPAREN    NO()  ), # bare sub call (without parens)
583 );
584
585
586
587 #foo() called before sub foo was parsed */
588 addbits('gv', 5 => qw(OPpEARLY_CV EARLYCV));
589
590
591
592 # 1st arg is replacement string */
593 addbits('substr', 4 => qw(OPpSUBSTR_REPL_FIRST REPL1ST));
594
595
596
597 addbits('padrange',
598     # bits 0..6 hold target range
599     '0..6' =>  {
600             label         => 'range',
601             mask_def      => 'OPpPADRANGE_COUNTMASK',
602             bitcount_def  => 'OPpPADRANGE_COUNTSHIFT',
603           }
604      # 7    => OPpLVAL_INTRO, already defined above
605 );
606
607
608
609 for (qw(aelemfast aelemfast_lex)) {
610     addbits($_,
611         '0..7' =>  {
612                 label     => 'key',
613               }
614     );
615 }
616
617
618
619 addbits('rv2gv',
620     2 => qw(OPpDONT_INIT_GV NOINIT), # Call gv_fetchpv with GV_NOINIT
621                             # (Therefore will return whatever is currently in
622                             # the symbol table, not guaranteed to be a PVGV)
623     6 => qw(OPpALLOW_FAKE   FAKE),   # OK to return fake glob
624 );
625
626
627 # NB OPpITER_REVERSED must always be bit 1: see pp_iter()
628
629 addbits('enteriter',
630                     1 => qw(OPpITER_REVERSED REVERSED),# for (reverse ...)
631                     3 => qw(OPpITER_DEF      DEF),     # 'for $_'
632 );
633 addbits('iter',     1 => qw(OPpITER_REVERSED REVERSED));
634
635
636
637 addbits('const',
638     1 => qw(OPpCONST_NOVER        NOVER),   # no 6;
639     2 => qw(OPpCONST_SHORTCIRCUIT SHORT),   # e.g. the constant 5 in (5 || foo)
640     3 => qw(OPpCONST_STRICT       STRICT),  # bareword subject to strict 'subs'
641     4 => qw(OPpCONST_ENTERED      ENTERED), # Has been entered as symbol
642     6 => qw(OPpCONST_BARE         BARE),    # Was a bare word (filehandle?)
643 );
644
645
646
647 # Range arg potentially a line num. */
648 addbits($_, 6 => qw(OPpFLIP_LINENUM LINENUM)) for qw(flip flop);
649
650
651
652 # Guessed that pushmark was needed. */
653 addbits('list', 6 => qw(OPpLIST_GUESSED GUESSED));
654
655
656
657 addbits('delete',
658     5 => qw(OPpKVSLICE KVSLICE), # Operating on a list of key/value pairs
659     6 => qw(OPpSLICE   SLICE  ), # Operating on a list of keys
660    #7 => OPpLVAL_INTRO, already defined above
661 );
662
663
664
665 # Checking for &sub, not {} or [].
666 addbits('exists', 6 => qw(OPpEXISTS_SUB SUB));
667
668
669
670 addbits('sort',
671     0 => qw(OPpSORT_NUMERIC  NUM    ), # Optimized away { $a <=> $b }
672     1 => qw(OPpSORT_INTEGER  INT    ), # Ditto while under "use integer"
673     2 => qw(OPpSORT_REVERSE  REV    ), # Reversed sort
674     3 => qw(OPpSORT_INPLACE  INPLACE), # sort in-place; eg @a = sort @a
675     4 => qw(OPpSORT_DESCEND  DESC   ), # Descending sort
676     5 => qw(OPpSORT_QSORT    QSORT  ), # Use quicksort (not mergesort)
677     6 => qw(OPpSORT_STABLE   STABLE ), # Use a stable algorithm
678 );
679
680
681
682 # reverse in-place (@a = reverse @a) */
683 addbits('reverse', 3 => qw(OPpREVERSE_INPLACE  INPLACE));
684
685
686
687 for (qw(open backtick)) {
688     addbits($_,
689         4 => qw(OPpOPEN_IN_RAW    INBIN ), # binmode(F,":raw")  on input  fh
690         5 => qw(OPpOPEN_IN_CRLF   INCR  ), # binmode(F,":crlf") on input  fh
691         6 => qw(OPpOPEN_OUT_RAW   OUTBIN), # binmode(F,":raw")  on output fh
692         7 => qw(OPpOPEN_OUT_CRLF  OUTCR ), # binmode(F,":crlf") on output fh
693     );
694 }
695
696
697
698 # The various OPpFT* filetest ops
699
700 # "use filetest 'access'" is in scope:
701 # this flag is set only on a subset of the FT* ops
702 addbits($_, 1 => qw(OPpFT_ACCESS FTACCESS)) for ops_with_arg(0, 'F-+');
703
704 # all OPpFT* ops except stat and lstat
705 for (grep { $_ !~ /^l?stat$/ } ops_with_flag('-')) {
706     addbits($_,
707         2 => qw(OPpFT_STACKED  FTSTACKED ),  # stacked filetest,
708                                              #    e.g. "-f" in "-f -x $foo"
709         3 => qw(OPpFT_STACKING FTSTACKING),  # stacking filetest.
710                                              #    e.g. "-x" in "-f -x $foo"
711         4 => qw(OPpFT_AFTER_t  FTAFTERt  ),  # previous op was -t
712     );
713 }
714
715
716
717 addbits('entereval',
718     1 => qw(OPpEVAL_HAS_HH       HAS_HH ), # Does it have a copy of %^H ?
719     2 => qw(OPpEVAL_UNICODE      UNI    ),
720     3 => qw(OPpEVAL_BYTES        BYTES  ),
721     4 => qw(OPpEVAL_COPHH        COPHH  ), # Construct %^H from COP hints
722     5 => qw(OPpEVAL_RE_REPARSING REPARSE), # eval_sv(..., G_RE_REPARSING)
723 );
724
725
726
727 # These must not conflict with OPpDONT_INIT_GV or OPpALLOW_FAKE.
728 # See pp.c:S_rv2gv. */
729 addbits('coreargs',
730     0 => qw(OPpCOREARGS_DEREF1    DEREF1), # Arg 1 is a handle constructor
731     1 => qw(OPpCOREARGS_DEREF2    DEREF2), # Arg 2 is a handle constructor
732    #2 reserved for OPpDONT_INIT_GV in rv2gv
733    #4 reserved for OPpALLOW_FAKE   in rv2gv
734     6 => qw(OPpCOREARGS_SCALARMOD $MOD  ), # \$ rather than \[$@%*]
735     7 => qw(OPpCOREARGS_PUSHMARK  MARK  ), # Call pp_pushmark
736 );
737
738
739
740 addbits('split',
741     # @a = split() has been replaced with  split() where split itself
742     # does the array assign
743     4 => qw(OPpSPLIT_ASSIGN ASSIGN), 
744     3 => qw(OPpSPLIT_LEX LEX),  # the OPpSPLIT_ASSIGN is a lexical array
745     2 => qw(OPpSPLIT_IMPLIM IMPLIM), # implicit limit
746 );
747
748
749 addbits($_,
750     2 => qw(OPpLVREF_ELEM ELEM   ),
751     3 => qw(OPpLVREF_ITER ITER   ),
752 '4..5'=> {
753            mask_def => 'OPpLVREF_TYPE',
754            enum     => [ qw(
755                              0   OPpLVREF_SV   SV
756                              1   OPpLVREF_AV   AV
757                              2   OPpLVREF_HV   HV
758                              3   OPpLVREF_CV   CV
759                          )],
760          },
761    #6 => qw(OPpPAD_STATE STATE),
762    #7 => qw(OPpLVAL_INTRO LVINTRO),
763 ) for 'refassign', 'lvref';
764
765
766
767 addbits('multideref',
768     4 => qw(OPpMULTIDEREF_EXISTS EXISTS), # deref is actually exists
769     5 => qw(OPpMULTIDEREF_DELETE DELETE), # deref is actually delete
770 );
771
772
773
774 addbits('avhvswitch',
775     '0..1' => {
776                    mask_def  => 'OPpAVHVSWITCH_MASK',
777                    label     => 'offset',
778     }
779 );
780
781
782 addbits('argelem',
783    '1..2' =>  {
784                    mask_def  => 'OPpARGELEM_MASK',
785                    enum => [ qw(
786                                0   OPpARGELEM_SV   SV
787                                1   OPpARGELEM_AV   AV
788                                2   OPpARGELEM_HV   HV
789                            )],
790                },
791 );
792
793
794 # rv2hv and padhv in void/scalar context implementing 'keys %h'
795 # directly, without a following OP_KEYS
796
797 addbits('padhv',
798     0 => qw(OPpPADHV_ISKEYS KEYS),
799 );
800 addbits('rv2hv',
801     0 => qw(OPpRV2HV_ISKEYS KEYS),
802 );
803
804 # In conjunction with OPpTRUEBOOL, indicates that the test should be
805 # inverted. This allows both (index() == -1) and (index() != -1)
806 # to optimise away the const and eq/ne
807
808 for (qw(index rindex)) {
809     addbits($_, 6 => qw(OPpINDEX_BOOLNEG NEG));
810 }
811
812
813
814 1;
815
816 # ex: set ts=8 sts=4 sw=4 et: