--- /dev/null
+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.
+
+ ExtUtils::Depends.
+
+SEE ALSO
+ subs::auto.
+
+ 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.
+