]> git.vpit.fr Git - perl/modules/Sub-Op.git/commitdiff
Add sub_op_init(), sub_op_dup() and sub_op_free() to the API
authorVincent Pit <vince@profvince.com>
Mon, 19 Apr 2010 22:09:38 +0000 (00:09 +0200)
committerVincent Pit <vince@profvince.com>
Mon, 19 Apr 2010 22:27:51 +0000 (00:27 +0200)
Makefile.PL
Op.xs
lib/Sub/Op.pm
sub_op.h
t/Sub-Op-LexicalSub/LexicalSub.xs

index 333dac0c4def2bb379555699cb1d0c12a0ae6fa1..cc065737e3ed13114c1c1f4741885fd344cce721 100644 (file)
@@ -71,7 +71,13 @@ WriteMakefile(
   PREOP    => "pod2text $file > \$(DISTVNAME)/README",
   COMPRESS => 'gzip -9f', SUFFIX => 'gz'
  },
- FUNCLIST         => [ qw/sub_op_register boot_Sub__Op/ ],
+ FUNCLIST         => [ qw[
+  boot_Sub__Op
+  sub_op_init
+  sub_op_register
+  sub_op_dup
+  sub_op_free
+ ] ],
  %ed_vars,
 );
 
diff --git a/Op.xs b/Op.xs
index 634ddc873f87e8297bf1dc030b9b1a32ba3730ed..ecdac3a3cbfe578bfd3fc47bab22f6e25c41499a 100644 (file)
--- a/Op.xs
+++ b/Op.xs
@@ -113,6 +113,16 @@ typedef struct {
 
 #include "sub_op.h"
 
+void sub_op_init(sub_op_config_t *c) {
+ c->name    = NULL;
+ c->namelen = 0;
+ c->pp      = 0;
+ c->check   = 0;
+ c->ud      = NULL;
+
+ return;
+}
+
 void sub_op_register(pTHX_ const sub_op_config_t *c) {
  SV *key = newSViv(PTR2IV(c->pp));
 
@@ -136,6 +146,27 @@ void sub_op_register(pTHX_ const sub_op_config_t *c) {
  }
 }
 
+sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig) {
+ sub_op_config_t *dupe = PerlMemShared_malloc(sizeof *dupe);
+
+ dupe->namelen = orig->namelen;
+ dupe->name    = PerlMemShared_malloc(dupe->namelen);
+ Copy(orig->name, dupe->name, dupe->namelen, char);
+
+ dupe->pp      = orig->pp;
+ dupe->check   = orig->check;
+ dupe->ud      = orig->ud;
+
+ return dupe;
+}
+
+void sub_op_free(pTHX_ sub_op_config_t *c) {
+ PerlMemShared_free((char *) c->name);
+ PerlMemShared_free(c);
+
+ return;
+}
+
 /* --- Private helpers ----------------------------------------------------- */
 
 STATIC IV so_hint(pTHX) {
index 8b7325658143c7f5ac1763b84c11c8a5649ea813..cf67eac9e5317a8f7f984798d8fb3cbb134ca3e6 100644 (file)
@@ -50,6 +50,7 @@ In your XS file :
     BOOT:
     {
      sub_op_config_t c;
+     sub_op_init(&c);
      c.name    = "reftype";
      c.namelen = sizeof("reftype")-1;
      c.pp      = scalar_util_reftype;
@@ -246,12 +247,26 @@ An optional user data passed to the C<check> callback.
 
 =back
 
+=head2 C<void sub_op_init(sub_op_config_t *c)>
+
+Initializes the fields of the C<sub_op_config_t> 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<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.
 
+=head2 C<sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig)>
+
+Deeply clones the specified C<sub_op_config_t> object.
+
+=head2 C<void sub_op_free(pTHX_ sub_op_config_t *c)>
+
+Free the memory associated with the specified C<sub_op_config_t> object.
+
 =head1 PERL API
 
 =head2 C<enable $name, [ $pkg ]>
index 77c899fcc4ac71c2a1fec859d86cf93a0ef6233d..c594f036e681fb4ad21a9c09d52fed32cf21ef04 100644 (file)
--- a/sub_op.h
+++ b/sub_op.h
@@ -14,6 +14,9 @@ typedef struct {
  void          *ud;
 } sub_op_config_t;
 
-void sub_op_register(pTHX_ const sub_op_config_t *c);
+void             sub_op_init    (sub_op_config_t *c);
+void             sub_op_register(pTHX_ const sub_op_config_t *c);
+sub_op_config_t *sub_op_dup     (pTHX_ const sub_op_config_t *c);
+void             sub_op_free    (pTHX_ sub_op_config_t *c);
 
 #endif /* SUB_OP_H */
index a4d2d8e6cc2ccbc19b56f70005434b4893cacabc..c2b7002d11ac6dd00964461bc7b5d1bb4c302bc7 100644 (file)
@@ -62,6 +62,7 @@ PPCODE:
  if (SvROK(cb)) {
   cb = SvRV(cb);
   if (SvTYPE(cb) >= SVt_PVCV) {
+   sub_op_init(&c);
    c.name  = SvPV_const(name, c.namelen);
    c.check = sols_check;
    c.ud    = SvREFCNT_inc(cb);