Opcodes - More Opcodes information from opnames.h and opcode.h
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'
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.
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
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
CPAN Testers: https://cpantesters.org/distro/O/Opcodes
Reini Urban [email protected]
2010, 2014
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.