Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
C Perl
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
t
.gitignore
.travis.yml
Changes
LICENSE
MANIFEST
Makefile.PL
Opcodes.xs
README.md
ppport.h

README.md

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.

  • 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 -- The Perl CORE Opcode module for handling sets of Opcodes used by Safe.

Safe -- Opcode and namespace limited execution compartments

B::CC -- The optimizing perl compiler uses this module. Jit also, but only the static information

TEST REPORTS

CPAN Testers: http://cpantesters.org/distro/O/Opcodes

Travis

Coveralls

AUTHOR

Reini Urban rurban@cpan.org 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.

Something went wrong with that request. Please try again.