]> git.vpit.fr Git - perl/modules/Sub-Op.git/commitdiff
More docs
authorVincent Pit <vince@profvince.com>
Sat, 2 Jan 2010 18:19:07 +0000 (19:19 +0100)
committerVincent Pit <vince@profvince.com>
Sat, 2 Jan 2010 18:19:07 +0000 (19:19 +0100)
lib/Sub/Op.pm

index 877cf3123c4a64ec15272a76b3ae29773155f60b..1702f3ee49e731d9efe9ea53b62943571b3a2ad1 100644 (file)
@@ -93,6 +93,29 @@ In your F<Makefile.PL> :
      ...
     );
 
+=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<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 L<B> and L<B::Deparse> are loaded, they get automatically monkeypatched so that introspecting modules like L<B::Concise> and L<B::Deparse> 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<sub_op_config_t>
+
+A typedef'd struct that configures how L<Sub::Op> should handle a given subroutine name.
+It has the following members :
+
+=over 4
+
+=item *
+
+C<const char *name>
+
+The name of the subroutine you want to replace.
+Allowed to be static.
+
+=item *
+
+C<STRLEN len>
+
+C<name>'s length, in bytes.
+
+=item *
+
+C<Perl_ppaddr_t pp>
+
+The pp function that will be called instead of the subroutine.
+C<Perl_ppaddr_t> is a typedef'd function pointer defined by perl as :
+
+    typedef OP *(*Perl_ppaddr_t)(pTHX);
+
+=item *
+
+C<sub_op_check_t check>
+
+An optional callback that will be called each time a call to C<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.
+C<sub_op_check_t> is a typedef'd function pointer defined by :
+
+    typedef OP *(*sub_op_check_t)(pTHX_ OP *, void *);
+
+=item *
+
+C<void *ud>
+
+An optional user data passed to the C<check> callback.
+
+=back
+
+=head2 C<void sub_op_register(pTHX_ const sub_op_config_t *c)>
+
+Registers a name and its configuration into L<Sub::Op>.
+The caller is responsible for allocating and freeing the C<sub_op_config_t> object.
+No pointer to it or to its members is kept.
+
+=head1 PERL API
+
+=head2 C<enable $name, [ $pkg ]>
+
+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<sub_op_register> 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 $name, [ $pkg ]>
+
+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<t/Sub-Op-Test> directory that implements a complete example.
+
 =head1 DEPENDENCIES
 
 L<perl> 5.10.