NAME
Sub::Op - Install subroutines as opcodes.
VERSION
Version 0.01
SYNOPSIS
In your XS file :
#include "sub_op.h"
STATIC OP *scalar_util_reftype(pTHX) {
dSP;
dMARK;
SV *sv = POPs;
if (SvMAGICAL(sv))
mg_get(sv);
if (SvROK(sv))
PUSHs(sv_reftype(SvRV(sv), 0));
else
PUSHs(&PL_sv_undef);
RETURN;
}
MODULE = Scalar::Util::Ops PACKAGE = Scalar::Util::Ops
BOOT:
{
sub_op_config_t c;
c.name = "reftype";
c.len = sizeof("reftype")-1;
c.pp = scalar_util_reftype;
c.check = 0;
c.ud = NULL;
sub_op_register(aTHX_ &c);
}
In your Perl module file :
package Scalar::Util::Ops;
use strict;
use warnings;
our ($VERSION, @ISA);
use Sub::Op; # Before loading our own shared library
BEGIN {
$VERSION = '0.01';
require DynaLoader;
push @ISA, 'DynaLoader';
__PACKAGE__->bootstrap($VERSION);
}
sub import { Sub::Op::enable(reftype => scalar caller) }
sub unimport { Sub::Op::disable(reftype => scalar caller) }
1;
In your Makefile.PL :
use ExtUtils::Depends;
my $ed = ExtUtils::Depends->new('Scalar::Util::Ops' => 'Sub::Op');
WriteMakefile(
$ed->get_makefile_vars,
...
);
DESCRIPTION
This module provides a C and Perl API for replacing subroutine calls by custom opcodes. This has two main advantages :
it gets rid of the overhead of a normal subroutine call ;
there's no symbol table entry defined for the subroutine.
Subroutine calls with and without parenthesis are handled. Ampersand calls are not replaced, and as such will still allow to call a subroutine with same name defined earlier. This may or may not be considered as a bug, but it gives the same semantics as Perl keywords, so I believe it's reasonable.
When B and B::Deparse are loaded, they get automatically monkeypatched so that introspecting modules like B::Concise and B::Deparse still produce a valid output.
C API
sub_op_config_t
A typedef'd struct that configures how Sub::Op should handle a given subroutine name. It has the following members :
const char *name
The name of the subroutine you want to replace. Allowed to be static.
STRLEN len
name
's length, in bytes.Perl_ppaddr_t pp
The pp function that will be called instead of the subroutine.
Perl_ppaddr_t
is a typedef'd function pointer defined by perl as :typedef OP *(*Perl_ppaddr_t)(pTHX);
sub_op_check_t check
An optional callback that will be called each time a call to
name
is replaced. You can use it to attach extra info to those ops (e.g. with a pointer table) or to perform more optimizations to the optree.sub_op_check_t
is a typedef'd function pointer defined by :typedef OP *(*sub_op_check_t)(pTHX_ OP *, void *);
void *ud
An optional user data passed to the
check
callback.
void sub_op_register(pTHX_ const sub_op_config_t *c)
Registers a name and its configuration into Sub::Op. The caller is responsible for allocating and freeing the sub_op_config_t
object. No pointer to it or to its members is kept.
PERL API
enable $name, [ $pkg ]
Enable the replacement with a custom opcode of calls to the $name
subroutine of the $pkg
package in the current lexical scope. A pp callback must have been registered for $name
by calling the C function sub_op_register
in the XS section of your module.
When $pkg
is not set, it defaults to the caller package.
disable $name, [ $pkg ]
Disable the replacement for calls to $name
in the package $pkg
.
When $pkg
is not set, it defaults to the caller package.
EXAMPLES
See the t/Sub-Op-LexicalSub directory that implements a complete example.
DEPENDENCIES
perl 5.10.
Variable::Magic, B::Hooks::EndOfScope.
SEE ALSO
B::Hooks::OP::Check::EntersubForCV.
AUTHOR
Vincent Pit, <perl at profvince.com>
, http://www.profvince.com.
You can contact me by mail or on irc.perl.org
(vincent).
BUGS
Please report any bugs or feature requests to bug-sub-op at rt.cpan.org
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Sub-Op. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Sub::Op
Tests code coverage report is available at http://www.profvince.com/perl/cover/Sub-Op.
COPYRIGHT & LICENSE
Copyright 2010 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.