X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FSub-Op.git;a=blobdiff_plain;f=lib%2FSub%2FOp.pm;h=44b3e9b671d5379b1374f63496e3df64958ed899;hp=c075bbb8612aae2b8fe7502139a8ad8419116341;hb=159088ccddecdea45fdae8093319b41c097adc86;hpb=a3c83d0adc138681da18079c268948d2fe9326d7 diff --git a/lib/Sub/Op.pm b/lib/Sub/Op.pm index c075bbb..44b3e9b 100644 --- a/lib/Sub/Op.pm +++ b/lib/Sub/Op.pm @@ -11,7 +11,7 @@ Sub::Op - Install subroutines as opcodes. =head1 VERSION -Version 0.01 +Version 0.02 =cut @@ -20,7 +20,7 @@ our ($VERSION, @ISA); sub dl_load_flags { 0x01 } BEGIN { - $VERSION = '0.01'; + $VERSION = '0.02'; require DynaLoader; push @ISA, 'DynaLoader'; __PACKAGE__->bootstrap($VERSION); @@ -50,12 +50,13 @@ In your XS file : 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); + sub_op_init(&c); + c.name = "reftype"; + c.namelen = sizeof("reftype")-1; + c.pp = scalar_util_reftype; + c.check = 0; + c.ud = NULL; + sub_op_register(aTHX_ &c, 0); } In your Perl module file : @@ -215,7 +216,7 @@ Allowed to be static. =item * -C +C C's length, in bytes. @@ -246,11 +247,25 @@ An optional user data passed to the C callback. =back -=head2 C +=head2 C + +Initializes the fields of the C object. +For future compatibility, it is required to call this function with your config object before storing your actual values. +It will store safe defaults for members you won't set. + +=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. +No pointer to it or to its members is kept, except if you pass the flag C in which case the configuration object will be stolen to be stored into L's internal datastructure. + +=head2 C + +Deeply clones the specified C object. + +=head2 C + +Free the memory associated with the specified C object. =head1 PERL API @@ -435,6 +450,14 @@ BEGIN { _monkeypatch() } See the F directory that implements a complete example. +=head1 CAVEATS + +Preexistent definitions of a sub whose name is handled by L are restored at the end of the lexical scope in which the module is used. +But if you define a sub in the scope of action of L with a name that is currently being replaced, the new declaration will be obliterated at the scope end. + +Function calls without parenthesis inside an C in the scope of the pragma won't be replaced. +I know a few ways of fixing this, but I've not yet decided on which. + =head1 DEPENDENCIES L 5.10.