From: Vincent Pit Date: Sat, 2 Jan 2010 18:19:07 +0000 (+0100) Subject: More docs X-Git-Tag: v0.01~6 X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=a2cacd5001fc982edeb39a4262079c6661ceb2f4;p=perl%2Fmodules%2FSub-Op.git More docs --- diff --git a/lib/Sub/Op.pm b/lib/Sub/Op.pm index 877cf31..1702f3e 100644 --- a/lib/Sub/Op.pm +++ b/lib/Sub/Op.pm @@ -93,6 +93,29 @@ In your F : ... ); +=head1 DESCRIPTION + +This module provides a C and Perl API for replacing subroutine calls by custom opcodes. +This has two main advantages : + +=over 4 + +=item * + +it gets rid of the overhead of a normal subroutine call ; + +=item * + +there's no symbol table entry defined for the subroutine. + +=back + +Subroutine calls with and without parenthesis are handled. +Ampersand calls are B 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 L and L are loaded, they get automatically monkeypatched so that introspecting modules like L and L still produce a valid output. + =cut use B::Hooks::EndOfScope; @@ -149,6 +172,72 @@ sub _dispell { Variable::Magic::dispell(%{"${pkg}::"}, $sw); } +=head1 C API + +=head2 C + +A typedef'd struct that configures how L should handle a given subroutine name. +It has the following members : + +=over 4 + +=item * + +C + +The name of the subroutine you want to replace. +Allowed to be static. + +=item * + +C + +C's length, in bytes. + +=item * + +C + +The pp function that will be called instead of the subroutine. +C is a typedef'd function pointer defined by perl as : + + typedef OP *(*Perl_ppaddr_t)(pTHX); + +=item * + +C + +An optional callback that will be called each time a call to C 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. +C is a typedef'd function pointer defined by : + + typedef OP *(*sub_op_check_t)(pTHX_ OP *, void *); + +=item * + +C + +An optional user data passed to the C callback. + +=back + +=head2 C + +Registers a name and its configuration into L. +The caller is responsible for allocating and freeing the C object. +No pointer to it or to its members is kept. + +=head1 PERL API + +=head2 C + +Enable the replacement with a custom opcode of calls to the C<$name> subroutine of the C<$pkg> package in the current lexical scope. +A pp callback must have been registered for C<$name> by calling the C function C in the XS section of your module. + +When C<$pkg> is not set, it defaults to the caller package. + +=cut + sub enable { my $name = shift; @@ -171,6 +260,14 @@ sub enable { return; } +=head2 C + +Disable the replacement for calls to C<$name> in the package C<$pkg>. + +When C<$pkg> is not set, it defaults to the caller package. + +=cut + sub disable { my $name = shift; @@ -275,6 +372,10 @@ sub _inject { BEGIN { _monkeypatch() } +=head1 EXAMPLES + +See the F directory that implements a complete example. + =head1 DEPENDENCIES L 5.10.