This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
use LOOP struct for entergiven op
[perl5.git] / regen / opcodes
index efb1daf..b60eda0 100644 (file)
 # logop       - |            listop   - @            pmop       - /
 # padop/svop  - $            padop    - # (unused)   loop       - {
 # baseop/unop - %            loopexop - }            filestatop - -
-# pvop/svop   - "            cop      - ;
+# pvop/svop   - "            cop      - ;            methop     - .
+# unop_aux    - +
 
 # Other options are:
-#   needs stack mark                    - m
-#   needs constant folding              - f
-#   produces a scalar                   - s
-#   produces an integer                 - i
-#   needs a target                      - t
-#   target can be in a pad              - T
-#   has a corresponding integer version - I
-#   has side effects                    - d
-#   uses $_ if no argument given        - u
+#   needs stack mark                    - m  (OA_MARK)
+#   needs constant folding              - f  (OA_FOLDCONST)
+#   produces a scalar                   - s  (OA_RETSCALAR)
+#   produces an integer                 - i  (unused)
+#   needs a target                      - t  (OA_TARGET)
+#   target can be in a pad              - T  (OA_TARGET|OA_TARGLEX)
+#   has a corresponding integer version - I  (OA_OTHERINT)
+#   make temp copy in list assignment   - d  (OA_DANGEROUS)
+#   uses $_ if no argument given        - u  (OA_DEFGV)
 
 # Values for the operands are:
 # scalar      - S            list     - L            array     - A
 # hash        - H            sub (CV) - C            file      - F
 # socket      - Fs           filetest - F-           filetest_access - F-+
+# num-compare - S<           dirhandle - DF          infix bitwise   - S|
 
 # reference - R
 # "?" denotes an optional operand.
@@ -49,22 +51,20 @@ const               constant item           ck_svconst      s$
 
 gvsv           scalar variable         ck_null         ds$     
 gv             glob value              ck_null         ds$     
-gelem          glob elem               ck_null         d     S S
+gelem          glob elem               ck_null         ds2     S S
 padsv          private variable        ck_null         ds0
 padav          private array           ck_null         d0
 padhv          private hash            ck_null         d0
 padany         private value           ck_null         d0
 
-pushre         push regexp             ck_null         d/
-
 # References and stuff.
 
 rv2gv          ref-to-glob cast        ck_rvconst      ds1     
 rv2sv          scalar dereference      ck_rvconst      ds1     
 av2arylen      array length            ck_null         is1     
 rv2cv          subroutine dereference  ck_rvconst      d1
-anoncode       anonymous subroutine    ck_anoncode           
-prototype      subroutine prototype    ck_null         s%      S
+anoncode       anonymous subroutine    ck_anoncode     s$      
+prototype      subroutine prototype    ck_prototype    su%     S?
 refgen         reference constructor   ck_spair        m1      L
 srefgen                single ref constructor  ck_null         fs1     S
 ref            reference-type operator ck_fun          stu%    S?
@@ -72,7 +72,7 @@ bless         bless                   ck_fun          s@      S S?
 
 # Pushy I/O.
 
-backtick       quoted execution (``, qx)       ck_open         tu%     S?
+backtick       quoted execution (``, qx)       ck_backtick     tu%     S?
 # glob defaults its first arg to $_
 glob           glob                    ck_glob         t@      S?
 readline       <HANDLE>                ck_readline     t%      F?
@@ -83,17 +83,17 @@ rcatline    append I/O operator     ck_null         t$
 regcmaybe      regexp internal guard   ck_fun          s1      S
 regcreset      regexp internal reset   ck_fun          s1      S
 regcomp                regexp compilation      ck_null         s|      S
-match          pattern match (m//)     ck_match        d/
+match          pattern match (m//)     ck_match        /
 qr             pattern quote (qr//)    ck_match        s/
-subst          substitution (s///)     ck_match        dis/    S
-substcont      substitution iterator   ck_null         dis|    
+subst          substitution (s///)     ck_match        is/     S
+substcont      substitution iterator   ck_null         is|     
 trans          transliteration (tr///) ck_match        is"     S
-# transr (the /r version) is further down.
+# y///r
+transr         transliteration (tr///) ck_match        is"     S
 
 # Lvalue operators.
-# sassign is special-cased for op class
 
-sassign                scalar assignment       ck_sassign      s0
+sassign                scalar assignment       ck_sassign      s2      S S
 aassign                list assignment         ck_null         t2      L L
 
 chop           chop                    ck_spair        mts%    L
@@ -101,18 +101,18 @@ schop             scalar chop             ck_null         stu%    S?
 chomp          chomp                   ck_spair        mTs%    L
 schomp         scalar chomp            ck_null         sTu%    S?
 defined                defined operator        ck_defined      isu%    S?
-undef          undef operator          ck_lfun         s%      S?
+undef          undef operator          ck_fun          s%      R?
 study          study                   ck_fun          su%     S?
-pos            match position          ck_lfun         stu%    S?
+pos            match position          ck_fun          stu%    R?
 
 preinc         preincrement (++)               ck_lfun         dIs1    S
 i_preinc       integer preincrement (++)       ck_lfun         dis1    S
 predec         predecrement (--)               ck_lfun         dIs1    S
 i_predec       integer predecrement (--)       ck_lfun         dis1    S
-postinc                postincrement (++)              ck_lfun         dIst1   S
-i_postinc      integer postincrement (++)      ck_lfun         disT1   S
-postdec                postdecrement (--)              ck_lfun         dIst1   S
-i_postdec      integer postdecrement (--)      ck_lfun         disT1   S
+postinc                postincrement (++)              ck_lfun         Ist1    S
+i_postinc      integer postincrement (++)      ck_lfun         ist1    S
+postdec                postdecrement (--)              ck_lfun         Ist1    S
+i_postdec      integer postdecrement (--)      ck_lfun         ist1    S
 
 # Ordinary operators.
 
@@ -124,32 +124,33 @@ divide            division (/)            ck_null         IfsT2   S S
 i_divide       integer division (/)    ck_null         ifsT2   S S
 modulo         modulus (%)             ck_null         IifsT2  S S
 i_modulo       integer modulus (%)     ck_null         ifsT2   S S
-repeat         repeat (x)              ck_repeat       mt2     L S
+repeat         repeat (x)              ck_repeat       fmt2    L S
 
 add            addition (+)            ck_null         IfsT2   S S
 i_add          integer addition (+)    ck_null         ifsT2   S S
 subtract       subtraction (-)         ck_null         IfsT2   S S
 i_subtract     integer subtraction (-) ck_null         ifsT2   S S
 concat         concatenation (.) or string     ck_concat       fsT2    S S
-stringify      string                  ck_fun          fsT@    S
+multiconcat    concatenation (.) or string     ck_null sT+
+stringify      string                  ck_stringify    fsT@    S
 
 left_shift     left bitshift (<<)      ck_bitop        fsT2    S S
 right_shift    right bitshift (>>)     ck_bitop        fsT2    S S
 
-lt             numeric lt (<)          ck_null         Iifs2   S S
-i_lt           integer lt (<)          ck_null         ifs2    S S
-gt             numeric gt (>)          ck_null         Iifs2   S S
-i_gt           integer gt (>)          ck_null         ifs2    S S
-le             numeric le (<=)         ck_null         Iifs2   S S
-i_le           integer le (<=)         ck_null         ifs2    S S
-ge             numeric ge (>=)         ck_null         Iifs2   S S
-i_ge           integer ge (>=)         ck_null         ifs2    S S
-eq             numeric eq (==)         ck_null         Iifs2   S S
-i_eq           integer eq (==)         ck_null         ifs2    S S
-ne             numeric ne (!=)         ck_null         Iifs2   S S
-i_ne           integer ne (!=)         ck_null         ifs2    S S
-ncmp           numeric comparison (<=>)        ck_null         Iifst2  S S
-i_ncmp         integer comparison (<=>)        ck_null         ifst2   S S
+lt             numeric lt (<)          ck_cmp          Iifs2   S S<
+i_lt           integer lt (<)          ck_cmp          ifs2    S S<
+gt             numeric gt (>)          ck_cmp          Iifs2   S S<
+i_gt           integer gt (>)          ck_cmp          ifs2    S S<
+le             numeric le (<=)         ck_cmp          Iifs2   S S<
+i_le           integer le (<=)         ck_cmp          ifs2    S S<
+ge             numeric ge (>=)         ck_cmp          Iifs2   S S<
+i_ge           integer ge (>=)         ck_cmp          ifs2    S S<
+eq             numeric eq (==)         ck_cmp          Iifs2   S S<
+i_eq           integer eq (==)         ck_cmp          ifs2    S S<
+ne             numeric ne (!=)         ck_cmp          Iifs2   S S<
+i_ne           integer ne (!=)         ck_cmp          ifs2    S S<
+ncmp           numeric comparison (<=>)        ck_null         Iifst2  S S<
+i_ncmp         integer comparison (<=>)        ck_null         ifst2   S S<
 
 slt            string lt               ck_null         ifs2    S S
 sgt            string gt               ck_null         ifs2    S S
@@ -159,16 +160,26 @@ seq               string eq               ck_null         ifs2    S S
 sne            string ne               ck_null         ifs2    S S
 scmp           string comparison (cmp) ck_null         ifst2   S S
 
-bit_and                bitwise and (&)         ck_bitop        fst2    S S
-bit_xor                bitwise xor (^)         ck_bitop        fst2    S S
-bit_or         bitwise or (|)          ck_bitop        fst2    S S
+bit_and                bitwise and (&)         ck_bitop        fst2    S S|
+bit_xor                bitwise xor (^)         ck_bitop        fst2    S S|
+bit_or         bitwise or (|)          ck_bitop        fst2    S S|
+nbit_and       numeric bitwise and (&) ck_bitop        fsT2    S S|
+nbit_xor       numeric bitwise xor (^) ck_bitop        fsT2    S S|
+nbit_or                numeric bitwise or (|)  ck_bitop        fsT2    S S|
+sbit_and       string bitwise and (&.) ck_bitop        fst2    S S|
+sbit_xor       string bitwise xor (^.) ck_bitop        fst2    S S|
+sbit_or                string bitwise or (|.)  ck_bitop        fst2    S S|
 
 negate         negation (-)            ck_null         Ifst1   S
-i_negate       integer negation (-)    ck_null         ifsT1   S
+i_negate       integer negation (-)    ck_null         ifst1   S
 not            not                     ck_null         ifs1    S
 complement     1's complement (~)      ck_bitop        fst1    S
+ncomplement    numeric 1's complement (~)      ck_bitop        fsT1    S
+# scomplement uses ck_bitop only for the experimental warning.  Once the
+# warning is gone, this can change to ck_null.
+scomplement    string 1's complement (~)       ck_bitop        fsT1    S
 
-smartmatch     smart match             ck_smartmatch   s2
+smartmatch     smart match             ck_null         ifs2    S S
 
 # High falutin' math.
 
@@ -190,14 +201,14 @@ abs               abs                     ck_fun          fsTu%   S?
 
 # String stuff.
 
-length         length                  ck_fun          ifsTu%  S?
+length         length                  ck_length       ifsTu%  S?
 substr         substr                  ck_substr       st@     S S S? S?
 vec            vec                     ck_fun          ist@    S S S
 
 index          index                   ck_index        isT@    S S S?
 rindex         rindex                  ck_index        isT@    S S S?
 
-sprintf                sprintf                 ck_fun          fmst@   S L
+sprintf                sprintf                 ck_lfun         fmst@   S L
 formline       formline                ck_fun          ms@     S L
 ord            ord                     ck_fun          ifsTu%  S?
 chr            chr                     ck_fun          fsTu%   S?
@@ -211,53 +222,59 @@ quotemeta quotemeta               ck_fun          fstu%   S?
 # Arrays.
 
 rv2av          array dereference       ck_rvconst      dt1     
-aelemfast      constant array element  ck_null         s$      A S
+aelemfast      constant array element  ck_null         ds$     A S
+aelemfast_lex  constant lexical array element  ck_null         d0      A S
 aelem          array element           ck_null         s2      A S
 aslice         array slice             ck_null         m@      A L
+kvaslice       index/value array slice ck_null         m@      A L
 
-aeach          each on array           ck_each         %       A
+aeach          each on array           ck_each         d%      A
+avalues                values on array         ck_each         dt%     A
 akeys          keys on array           ck_each         t%      A
-avalues                values on array         ck_each         t%      A
 
 # Hashes.
 
-each           each                    ck_each               H
-values         values                  ck_each         t%      H
+each           each                    ck_each         d%      H
+values         values                  ck_each         dt%     H
 keys           keys                    ck_each         t%      H
 delete         delete                  ck_delete       %       S
 exists         exists                  ck_exists       is%     S
 rv2hv          hash dereference        ck_rvconst      dt1     
 helem          hash element            ck_null         s2      H S
 hslice         hash slice              ck_null         m@      H L
-boolkeys       boolkeys                ck_fun          %       H
+kvhslice       key/value hash slice    ck_null         m@      H L
+
+# mixed array and hash access
+
+multideref     array or hash lookup    ck_null         ds+     
 
 # Explosives and implosives.
 
-unpack         unpack                  ck_unpack       @       S S?
-pack           pack                    ck_fun          mst@    S L
-split          split                   ck_split        t@      S S S
-join           join or string          ck_join         mst@    S L
+unpack         unpack                  ck_fun          u@      S S?
+pack           pack                    ck_fun          fmst@   S L
+split          split                   ck_split        t/      S S S
+join           join or string          ck_join         fmst@   S L
 
 # List operators.
 
 list           list                    ck_null         m@      L
 lslice         list slice              ck_null         2       H L L
-anonlist       anonymous list ([])     ck_fun          ms@     L
+anonlist       anonymous array ([])    ck_fun          ms@     L
 anonhash       anonymous hash ({})     ck_fun          ms@     L
 
-splice         splice                  ck_push         m@      A S? S? L
-push           push                    ck_push         imsT@   A L
+splice         splice                  ck_fun          m@      A S? S? L
+push           push                    ck_fun          imsT@   A L
 pop            pop                     ck_shift        s%      A?
 shift          shift                   ck_shift        s%      A?
-unshift                unshift                 ck_push         imsT@   A L
-sort           sort                    ck_sort         dm@     C? L
+unshift                unshift                 ck_fun          imsT@   A L
+sort           sort                    ck_sort         m@      C? L
 reverse                reverse                 ck_fun          mt@     L
 
-grepstart      grep                    ck_grep         dm@     C L
-grepwhile      grep iterator           ck_null         dt|     
+grepstart      grep                    ck_grep         m@      C L
+grepwhile      grep iterator           ck_null         t|      
 
-mapstart       map                     ck_grep         dm@     C L
-mapwhile       map iterator            ck_null         dt|
+mapstart       map                     ck_grep         m@      C L
+mapwhile       map iterator            ck_null         t|
 
 # Range stuff.
 
@@ -271,18 +288,20 @@ and               logical and (&&)                ck_null         |
 or             logical or (||)                 ck_null         |       
 xor            logical xor                     ck_null         fs2     S S     
 dor            defined or (//)                 ck_null         |
-cond_expr      conditional expression          ck_null         d|      
+cond_expr      conditional expression          ck_null               
 andassign      logical and assignment (&&=)    ck_null         s|      
 orassign       logical or assignment (||=)     ck_null         s|      
 dorassign      defined or assignment (//=)     ck_null         s|
 
-method         method lookup           ck_method       d1
-entersub       subroutine entry        ck_subr         dmt1    L
+entersub       subroutine entry        ck_subr         dm1     L
 leavesub       subroutine exit         ck_null         1       
 leavesublv     lvalue subroutine return        ck_null         1       
+argcheck       check subroutine arguments      ck_null         +
+argelem                subroutine argument     ck_null         +
+argdefelem     subroutine argument default value       ck_null         |
 caller         caller                  ck_fun          t%      S?
 warn           warn                    ck_fun          imst@   L
-die            die                     ck_die          dimst@  L
+die            die                     ck_fun          imst@   L
 reset          symbol reset            ck_fun          is%     S?
 
 lineseq                line sequence           ck_null         @       
@@ -296,16 +315,20 @@ enteriter foreach loop entry      ck_null         d{
 iter           foreach loop iterator   ck_null         0       
 enterloop      loop entry              ck_null         d{      
 leaveloop      loop exit               ck_null         2       
-return         return                  ck_return       dm@     L
-last           last                    ck_null         ds}     
-next           next                    ck_null         ds}     
-redo           redo                    ck_null         ds}     
+return         return                  ck_return       m@      L
+last           last                    ck_null         s}      
+next           next                    ck_null         s}      
+redo           redo                    ck_null         s}      
 dump           dump                    ck_null         ds}     
-goto           goto                    ck_null         ds}     
-exit           exit                    ck_exit         ds%     S?
-method_named   method with known name  ck_null         d$
-
-entergiven     given()                 ck_null         d|
+goto           goto                    ck_null         s}      
+exit           exit                    ck_fun          s%      S?
+method         method lookup           ck_method       d.
+method_named   method with known name  ck_null         d.
+method_super   super with known name   ck_null         d.
+method_redir   redirect method with known name ck_null d.
+method_redir_super     redirect super method with known name   ck_null d.
+
+entergiven     given()                 ck_null         d{
 leavegiven     leave given block       ck_null         1
 enterwhen      when()                  ck_null         d|
 leavewhen      leave when block        ck_null         1
@@ -324,7 +347,7 @@ binmode             binmode                 ck_fun          s@      F S?
 
 tie            tie                     ck_fun          idms@   R S L
 untie          untie                   ck_fun          is%     R
-tied           tied                    ck_fun          s%      R
+tied           tied                    ck_fun          ds%     R
 dbmopen                dbmopen                 ck_fun          is@     H S S
 dbmclose       dbmclose                ck_fun          is%     H
 
@@ -333,7 +356,7 @@ select              select                  ck_select       st@     F?
 
 getc           getc                    ck_eof          st%     F?
 read           read                    ck_fun          imst@   F R S S?
-enterwrite     write                   ck_fun          dis%    F?
+enterwrite     write                   ck_fun          is%     F?
 leavewrite     write exit              ck_null         1       
 
 prtf           printf                  ck_listiob      ims@    F? L
@@ -346,8 +369,8 @@ sysread             sysread                 ck_fun          imst@   F R S S?
 syswrite       syswrite                ck_fun          imst@   F S S? S?
 
 eof            eof                     ck_eof          is%     F?
-tell           tell                    ck_fun          st%     F?
-seek           seek                    ck_fun          s@      F S S
+tell           tell                    ck_tell         st%     F?
+seek           seek                    ck_tell         s@      F S S
 # truncate really behaves as if it had both "S S" and "F S"
 truncate       truncate                ck_trunc        is@     S S
 
@@ -377,8 +400,8 @@ getpeername getpeername             ck_fun          is%     Fs
 
 # Stat calls.  OP_IS_FILETEST wants them consecutive.
 
-lstat          lstat                   ck_ftst         u-      F
-stat           stat                    ck_ftst         u-      F
+lstat          lstat                   ck_ftst         u-      F?
+stat           stat                    ck_ftst         u-      F?
 ftrread                -R                      ck_ftst         isu-    F-+
 ftrwrite       -W                      ck_ftst         isu-    F-+
 ftrexec                -X                      ck_ftst         isu-    F-+
@@ -410,7 +433,7 @@ ftbinary    -B                      ck_ftst         isu-    F-
 # File calls.
 
 # chdir really behaves as if it had both "S?" and "F?"
-chdir          chdir                   ck_chdir        isT%    S?
+chdir          chdir                   ck_trunc        isT%    S?
 chown          chown                   ck_fun          imsT@   L
 chroot         chroot                  ck_fun          isTu%   S?
 unlink         unlink                  ck_fun          imsTu@  L
@@ -426,11 +449,11 @@ rmdir             rmdir                   ck_fun          isTu%   S?
 # Directory calls.
 
 open_dir       opendir                 ck_fun          is@     F S
-readdir                readdir                 ck_fun          %       F
-telldir                telldir                 ck_fun          st%     F
-seekdir                seekdir                 ck_fun          s@      F S
-rewinddir      rewinddir               ck_fun          s%      F
-closedir       closedir                ck_fun          is%     F
+readdir                readdir                 ck_fun          %       DF
+telldir                telldir                 ck_fun          st%     DF
+seekdir                seekdir                 ck_fun          s@      DF S
+rewinddir      rewinddir               ck_fun          s%      DF
+closedir       closedir                ck_fun          is%     DF
 
 # Process control.
 
@@ -438,8 +461,8 @@ fork                fork                    ck_null         ist0
 wait           wait                    ck_null         isT0    
 waitpid                waitpid                 ck_fun          isT@    S S
 system         system                  ck_exec         imsT@   S? L
-exec           exec                    ck_exec         dimsT@  S? L
-kill           kill                    ck_fun          dimsT@  L
+exec           exec                    ck_exec         imsT@   S? L
+kill           kill                    ck_fun          imsT@   L
 getppid                getppid                 ck_null         isT0    
 getpgrp                getpgrp                 ck_fun          isT%    S?
 setpgrp                setpgrp                 ck_fun          isT@    S? S?
@@ -448,10 +471,6 @@ setpriority        setpriority             ck_fun          isT@    S S S
 
 # Time calls.
 
-# NOTE: MacOS patches the 'i' of time() away later when the interpreter
-# is created because in MacOS time() is already returning times > 2**31-1,
-# that is, non-integers.
-
 time           time                    ck_null         isT0    
 tms            times                   ck_null         0       
 localtime      localtime               ck_fun          t%      S?
@@ -481,12 +500,11 @@ semctl            semctl                  ck_fun          imst@   S S S S
 
 # Eval.
 
-require                require                 ck_require      du%     S?
+require                require                 ck_require      dsu%    S?
 dofile         do "file"               ck_fun          d1      S
 hintseval      eval hints              ck_svconst      s$
-entereval      eval "string"           ck_eval         d%      S
+entereval      eval "string"           ck_eval         du%     S?
 leaveeval      eval "string" exit      ck_null         1       S
-#evalonce      eval constant string    ck_null         d1      S
 entertry       eval {block}            ck_eval         d|      
 leavetry       eval {block} exit       ck_null         @       
 
@@ -537,10 +555,21 @@ once              once                    ck_null         |
 
 custom         unknown custom operator         ck_null         0
 
-# For smart dereference for each/keys/values
-reach          each on reference                       ck_each         %       S
-rkeys          keys on reference                       ck_each         t%      S
-rvalues                values on reference                     ck_each         t%      S
+# For CORE:: subs
+coreargs       CORE:: subroutine       ck_null         $       
+avhvswitch     Array/hash switch       ck_null         t1
 
-# y///r
-transr         transliteration (tr///) ck_match        is"     S
+runcv          __SUB__                 ck_null         s0
+
+# fc and \F
+fc             fc                      ck_fun          fstu%   S?
+
+padcv          private subroutine      ck_null         d0
+introcv                private subroutine      ck_null         d0
+clonecv                private subroutine      ck_null         d0
+padrange       list of private variables       ck_null         d0
+refassign      lvalue ref assignment   ck_refassign    ds2
+lvref          lvalue ref assignment   ck_null         d%
+lvrefslice     lvalue ref assignment   ck_null         d@
+lvavref                lvalue array reference  ck_null         d%
+anonconst      anonymous constant      ck_null         ds1