|
Custom operator support is a new experimental feature that allows you to define your own
ops. This is primarily to allow the building of interpreters for other languages in the Perl
core, but it also allows optimizations through the creation of "macro-ops" (ops
which perform the functions of multiple ops which are usually executed together, such as gvsv,
gvsv, add.)
This feature is implemented as a new op type, OP_CUSTOM. The Perl core does
not "know" anything special about this op type, and so it will not be involved in
any optimizations. This also means that you can define your custom ops to be any op structure
- unary, binary, list and so on - you like.
It's important to know what custom operators won't do for you. They won't let you add new
syntax to Perl, directly. They won't even let you add new keywords, directly. In fact, they
won't change the way Perl compiles a program at all. You have to do those changes yourself,
after Perl has compiled the program. You do this either by manipulating the op tree using a CHECK
block and the B::Generate module, or by adding a custom peephole optimizer with
the optimize module.
When you do this, you replace ordinary Perl ops with custom ops by creating ops with the
type OP_CUSTOM and the pp_addr of your own PP function. This should
be defined in XS code, and should look like the PP ops in pp_*.c. You are
responsible for ensuring that your op takes the appropriate number of values from the stack,
and you are responsible for adding stack marks if necessary.
You should also "register" your op with the Perl interpreter so that it can
produce sensible error and warning messages. Since it is possible to have multiple custom ops
within the one "logical" op type OP_CUSTOM, Perl uses the value of o->op_ppaddr
as a key into the PL_custom_op_descs and PL_custom_op_names hashes.
This means you need to enter a name and description for your op at the appropriate place in
the PL_custom_op_names and PL_custom_op_descs hashes.
Forthcoming versions of B::Generate (version 1.0 and above) should directly
support the creation of custom ops by name; Opcodes::Custom will provide
functions which make it trivial to "register" custom ops to the Perl interpreter.
|