# NAME

Opcodes - More Opcodes information from opnames.h and opcode.h

# SYNOPSIS

   use Opcodes;
   print "Empty opcodes are null and ",
     join ",", map {opname $_}, opaliases(opname2code('null'));

   # All LOGOPs
   perl -MOpcodes -e'$,=q( );print map {opname $_} grep {opclass($_) == 2} 1..opcodes'

   # Ops which can return other than op->next
   perl -MOpcodes -e'$,=q( );print map {opname $_} grep {Opcodes::maybranch $_} 1..opcodes'



# DESCRIPTION

# Operator Names and Operator Lists

The canonical list of operator names is the contents of the array
PL\_op\_name, defined and initialised in file `opcode.h` of the Perl
source distribution (and installed into the perl library).

Each operator has both a terse name (its opname) and a more verbose or
recognisable descriptive name. The opdesc function can be used to
return a the description for an OP.

- an operator name (opname)

   Operator names are typically small lowercase words like enterloop,
   leaveloop, last, next, redo etc. Sometimes they are rather cryptic
   like gv2cv, i\_ncmp and ftsvtx.

- an OP opcode

   The opcode information functions all take the integer code, 0..MAX0,
   MAXO being accessed by scalar @opcodes, the length of
   the opcodes array.



# Opcode Information

Retrieve information of the Opcodes. All are available for export by the package.
Functions names starting with "op" are automatically exported.

- opcodes

   In a scalar context opcodes returns the number of opcodes in this
   version of perl (361 with perl-5.10).

   In a list context it returns a list of all the operators with
   its properties, a list of \[ opcode opname ppaddr check opargs \].

- opname (OP)

   Returns the lowercase name without pp\_ for the OP,
   an integer between 0 and MAXO.

- ppaddr (OP)

   Returns the address of the ppaddr, which can be used to
   get the aliases for each opcode.

- check (OP)

   Returns the address of the check function.

- opdesc (OP)

   Returns the string description of the OP.

- opargs (OP)

   Returns the opcode args encoded as integer of the opcode.
   See below or `opcode.pl` for the encoding details.

       opflags 1-128 + opclass 1-13 << 9 + argnum 1-15.. << 13

- argnum (OP)

   Returns the arguments and types encoded as number acccording
   to the following table, 4 bit for each argument.

       'S',  1,                # scalar
       'L',  2,                # list
       'A',  3,                # array value
       'H',  4,                # hash value
       'C',  5,                # code value
       'F',  6,                # file value
       'R',  7,                # scalar reference

       + '?',  8,            # optional

   Example:

       argnum(opname2code('bless')) => 145
       145 = 0b10010001 => S S?

       first 4 bits 0001 => 1st arg is a Scalar,
       next 4 bits  1001 => (bit 8+1) 2nd arg is an optional Scalar

- opclass (OP)

   Returns the op class as number according to the following table
   from `opcode.pl`:

       '0',  0,                # baseop
       '1',  1,                # unop
       '2',  2,                # binop
       '|',  3,                # logop
       '@',  4,                # listop
       '/',  5,                # pmop
       '$',  6,                # svop_or_padop
       '#',  7,                # padop
       '"',  8,                # pvop_or_svop
       '{',  9,                # loop
       ';',  10,               # cop
       '%',  11,               # baseop_or_unop
       '-',  12,               # filestatop
       '}',  13,               # loopexop

- opflags (OP)

   Returns op flags as number according to the following table
   from `opcode.pl`. In doubt see your perl source.
   _Warning: There is currently an attempt to change that, but I posted a fix_

       'm' =>  OA_MARK,                # needs stack mark
       'f' =>  OA_FOLDCONST,   # fold constants
       's' =>  OA_RETSCALAR,   # always produces scalar
       't' =>  OA_TARGET,              # needs target scalar
       'T' =>  OA_TARGET | OA_TARGLEX, # ... which may be lexical
       'i' =>  OA_RETINTEGER,  # always produces integer (this bit is in question)
       'I' =>  OA_OTHERINT,    # has corresponding int op
       'd' =>  OA_DANGEROUS,   # danger, unknown side effects
       'u' =>  OA_DEFGV,               # defaults to $_

   plus not from `opcode.pl`:

       'n' => OA_NOSTACK,              # nothing on the stack, no args and return
       'N' => OA_MAYBRANCH             # No next. may return other than PL_op->op_next, maybranch

   These not yet:

       'S' =>  OA_MAYSCALAR    # retval may be scalar
       'A' =>  OA_MAYARRAY     # retval may be array
       'V' =>  OA_MAYVOID              # retval may be void
       'F' =>  OA_RETFIXED     # fixed retval type, either S or A or V

- OA\_\* constants

   All OA\_ flag, class and argnum constants from `op.h` are exported.
   Addionally new OA\_ flags have been created which are needed for [B::CC](https://metacpan.org/pod/B::CC).

- opaliases (OP)

   Returns the opcodes for the aliased opcode functions for the given OP, the ops
   with the same ppaddr.

- opname2code (OPNAME)

   Does a reverse lookup in the opcodes list to get the opcode for the given
   name.

- maybranch (OP)

   Returns if the OP function may return not op->op\_next.

   Note that not all OP classes which have op->op\_other, op->op\_first or op->op\_last
   (higher then UNOP) are actually returning an other next op than op->op\_next.

       opflags(OP) & 16384

# SEE ALSO

[Opcode](https://metacpan.org/pod/Opcode) -- The Perl CORE Opcode module for handling sets of Opcodes used by [Safe](https://metacpan.org/pod/Safe).

[Safe](https://metacpan.org/pod/Safe) -- Opcode and namespace limited execution compartments

[B::CC](https://metacpan.org/pod/B::CC) -- The optimizing perl compiler uses this module. [Jit](https://metacpan.org/pod/Jit) also,
           but only the static information

# TEST REPORTS

CPAN Testers: [http://cpantesters.org/distro/O/Opcodes](http://cpantesters.org/distro/O/Opcodes)

[![Travis](https://travis-ci.org/rurban/Opcodes.png)](https://travis-ci.org/rurban/Opcodes/)

[![Coveralls](https://coveralls.io/repos/rurban/Opcodes/badge.png)](https://coveralls.io/r/rurban/Opcodes?branch=master)

# AUTHOR

Reini Urban `[email protected]` 2010, 2014

# LICENSE

Copyright 1995, Malcom Beattie.
Copyright 1996, Tim Bunce.
Copyright 2010, 2014 Reini Urban.
All rights reserved.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.