Skip to content

rurban/Opcodes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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: https://cpantesters.org/distro/O/Opcodes

Travis

Coveralls

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.