In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/a4051d2977a92b90787a41f76f3ae82ad6401d66?hp=76cc365d064e9bf5a0e771bb8ae2bf380b8b0d25>

- Log -----------------------------------------------------------------
commit a4051d2977a92b90787a41f76f3ae82ad6401d66
Author: Nicholas Clark <[email protected]>
Date:   Thu Oct 21 12:27:54 2010 +0200

    In [GNO]DBM_File.xs, store the 4 filter functions as 1 array in the struct.
    
    Previously they were 1 distinct members. Using an array allows the use of a
    in *_DESTROY, and merging of the 4 XS functions 
filter_{fetch,store}_{key,value}
    into 1 body with ALIASes.

M       ext/GDBM_File/GDBM_File.xs
M       ext/GDBM_File/typemap
M       ext/NDBM_File/NDBM_File.xs
M       ext/NDBM_File/typemap
M       ext/ODBM_File/ODBM_File.xs
M       ext/ODBM_File/typemap

commit f4603e303c60a90bd9050fdc96683a33e69bb849
Author: Nicholas Clark <[email protected]>
Date:   Wed Oct 20 21:28:30 2010 +0200

    In SDBM_File.xs, store the 4 filter functions as 1 array in the struct.
    
    Previously they were 1 distinct members. Using an array allows the use of a 
loop
    in sdbm_DESTROY, and merging of the 4 XS functions
    filter_{fetch,store}_{key,value} into 1 body with ALIASes.

M       ext/SDBM_File/SDBM_File.xs
M       ext/SDBM_File/typemap

commit a5c6857cbad41a80aba26d560558a58cbba0505f
Author: Nicholas Clark <[email protected]>
Date:   Wed Oct 20 21:08:37 2010 +0200

    Convert [GNOS]DBM_File::TIEHASH to safecalloc() from safemalloc() then 
Zero().

M       ext/GDBM_File/GDBM_File.xs
M       ext/NDBM_File/NDBM_File.xs
M       ext/ODBM_File/ODBM_File.xs
M       ext/SDBM_File/SDBM_File.xs
-----------------------------------------------------------------------

Summary of changes:
 ext/GDBM_File/GDBM_File.xs |   59 ++++++++++++++-----------------------------
 ext/GDBM_File/typemap      |   12 ++++----
 ext/NDBM_File/NDBM_File.xs |   59 ++++++++++++++-----------------------------
 ext/NDBM_File/typemap      |    8 +++---
 ext/ODBM_File/ODBM_File.xs |   58 +++++++++++++-----------------------------
 ext/ODBM_File/typemap      |   12 ++++----
 ext/SDBM_File/SDBM_File.xs |   58 +++++++++++++-----------------------------
 ext/SDBM_File/typemap      |    8 +++---
 8 files changed, 94 insertions(+), 180 deletions(-)

diff --git a/ext/GDBM_File/GDBM_File.xs b/ext/GDBM_File/GDBM_File.xs
index b418b25..5fea3d7 100644
--- a/ext/GDBM_File/GDBM_File.xs
+++ b/ext/GDBM_File/GDBM_File.xs
@@ -5,12 +5,14 @@
 #include <gdbm.h>
 #include <fcntl.h>
 
+#define fetch_key 0
+#define store_key 1
+#define fetch_value 2
+#define store_value 3
+
 typedef struct {
        GDBM_FILE       dbp ;
-       SV *    filter_fetch_key ;
-       SV *    filter_store_key ;
-       SV *    filter_fetch_value ;
-       SV *    filter_store_value ;
+       SV *    filter[4];
        int     filtering ;
        } GDBM_File_type;
 
@@ -73,8 +75,7 @@ gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = 
(FATALFUNC)croak)
 
            RETVAL = NULL ;
            if ((dbp =  gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, 
fatal_func))) {
-               RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ;
-               Zero(RETVAL, 1, GDBM_File_type) ;
+               RETVAL = (GDBM_File)safecalloc(1, sizeof(GDBM_File_type)) ;
                RETVAL->dbp = dbp ;
            }
            
@@ -92,16 +93,14 @@ gdbm_close(db)
 void
 gdbm_DESTROY(db)
        GDBM_File       db
+       PREINIT:
+       int i = store_value;
        CODE:
        gdbm_close(db);
-       if (db->filter_fetch_key)
-           SvREFCNT_dec(db->filter_fetch_key) ;
-       if (db->filter_store_key)
-           SvREFCNT_dec(db->filter_store_key) ;
-       if (db->filter_fetch_value)
-           SvREFCNT_dec(db->filter_fetch_value) ;
-       if (db->filter_store_value)
-           SvREFCNT_dec(db->filter_store_value) ;
+       do {
+           if (db->filter[i])
+               SvREFCNT_dec(db->filter[i]);
+       } while (i-- > 0);
        safefree(db);
 
 #define gdbm_FETCH(db,key)                     gdbm_fetch(db->dbp,key)
@@ -173,30 +172,10 @@ filter_fetch_key(db, code)
        GDBM_File       db
        SV *            code
        SV *            RETVAL = &PL_sv_undef ;
+       ALIAS:
+       GDBM_File::filter_fetch_key = fetch_key
+       GDBM_File::filter_store_key = store_key
+       GDBM_File::filter_fetch_value = fetch_value
+       GDBM_File::filter_store_value = store_value
        CODE:
-           DBM_setFilter(db->filter_fetch_key, code) ;
-
-SV *
-filter_store_key(db, code)
-       GDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_key, code) ;
-
-SV *
-filter_fetch_value(db, code)
-       GDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_fetch_value, code) ;
-
-SV *
-filter_store_value(db, code)
-       GDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_value, code) ;
-
+           DBM_setFilter(db->filter[ix], code);
diff --git a/ext/GDBM_File/typemap b/ext/GDBM_File/typemap
index 71fc285..d97acd4 100644
--- a/ext/GDBM_File/typemap
+++ b/ext/GDBM_File/typemap
@@ -15,7 +15,7 @@ FATALFUNC             T_OPAQUEPTR
 
 INPUT
 T_DATUM_K
-       DBM_ckFilter($arg, filter_store_key, \"filter_store_key\");
+       DBM_ckFilter($arg, filter[store_key], \"filter_store_key\");
        {
            STRLEN len;
            $var.dptr = SvPVbyte($arg, len);
@@ -25,9 +25,9 @@ T_DATUM_K_C
        {
            SV * tmpSV;
            STRLEN len;
-           if (db->filter_store_key) {
+           if (db->filter[store_key]) {
                tmpSV = sv_2mortal(newSVsv($arg)); 
-               DBM_ckFilter(tmpSV, filter_store_key, \"filter_store_key\");
+               DBM_ckFilter(tmpSV, filter[store_key], \"filter_store_key\");
             }
             else
                 tmpSV = $arg;
@@ -35,7 +35,7 @@ T_DATUM_K_C
            $var.dsize = (int)len;
        }
 T_DATUM_V
-        DBM_ckFilter($arg, filter_store_value, \"filter_store_value\");
+        DBM_ckFilter($arg, filter[store_value], \"filter_store_value\");
        if (SvOK($arg)) {
            STRLEN len;
            $var.dptr = SvPVbyte($arg, len);
@@ -49,9 +49,9 @@ T_DATUM_V
 OUTPUT
 T_DATUM_K
        output_datum(aTHX_ $arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+       DBM_ckFilter($arg, filter[fetch_key],\"filter_fetch_key\");
 T_DATUM_V
        output_datum(aTHX_ $arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
+       DBM_ckFilter($arg, filter[fetch_value],\"filter_fetch_value\");
 T_PTROBJ
         sv_setref_pv($arg, dbtype, (void*)$var);
diff --git a/ext/NDBM_File/NDBM_File.xs b/ext/NDBM_File/NDBM_File.xs
index 84d44cb..af8f02f 100644
--- a/ext/NDBM_File/NDBM_File.xs
+++ b/ext/NDBM_File/NDBM_File.xs
@@ -25,12 +25,14 @@ START_EXTERN_C
 END_EXTERN_C
 #endif
 
+#define fetch_key 0
+#define store_key 1
+#define fetch_value 2
+#define store_value 3
+
 typedef struct {
        DBM *   dbp ;
-       SV *    filter_fetch_key ;
-       SV *    filter_store_key ;
-       SV *    filter_fetch_value ;
-       SV *    filter_store_value ;
+       SV *    filter[4];
        int     filtering ;
        } NDBM_File_type;
 
@@ -66,8 +68,7 @@ ndbm_TIEHASH(dbtype, filename, flags, mode)
 
            RETVAL = NULL ;
            if ((dbp =  dbm_open(filename, flags, mode))) {
-               RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
-               Zero(RETVAL, 1, NDBM_File_type) ;
+               RETVAL = (NDBM_File)safecalloc(1, sizeof(NDBM_File_type));
                RETVAL->dbp = dbp ;
            }
            
@@ -78,16 +79,14 @@ ndbm_TIEHASH(dbtype, filename, flags, mode)
 void
 ndbm_DESTROY(db)
        NDBM_File       db
+       PREINIT:
+       int i = store_value;
        CODE:
        dbm_close(db->dbp);
-       if (db->filter_fetch_key)
-           SvREFCNT_dec(db->filter_fetch_key) ;
-       if (db->filter_store_key)
-           SvREFCNT_dec(db->filter_store_key) ;
-       if (db->filter_fetch_value)
-           SvREFCNT_dec(db->filter_fetch_value) ;
-       if (db->filter_store_value)
-           SvREFCNT_dec(db->filter_store_value) ;
+       do {
+           if (db->filter[i])
+               SvREFCNT_dec(db->filter[i]);
+       } while (i-- > 0);
        safefree(db);
 
 #define ndbm_FETCH(db,key)                     dbm_fetch(db->dbp,key)
@@ -145,30 +144,10 @@ filter_fetch_key(db, code)
        NDBM_File       db
        SV *            code
        SV *            RETVAL = &PL_sv_undef ;
+       ALIAS:
+       NDBM_File::filter_fetch_key = fetch_key
+       NDBM_File::filter_store_key = store_key
+       NDBM_File::filter_fetch_value = fetch_value
+       NDBM_File::filter_store_value = store_value
        CODE:
-           DBM_setFilter(db->filter_fetch_key, code) ;
-
-SV *
-filter_store_key(db, code)
-       NDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_key, code) ;
-
-SV *
-filter_fetch_value(db, code)
-       NDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_fetch_value, code) ;
-
-SV *
-filter_store_value(db, code)
-       NDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_value, code) ;
-
+           DBM_setFilter(db->filter[ix], code);
diff --git a/ext/NDBM_File/typemap b/ext/NDBM_File/typemap
index ad62e0a..bb741e4 100644
--- a/ext/NDBM_File/typemap
+++ b/ext/NDBM_File/typemap
@@ -17,12 +17,12 @@ INPUT
 T_DATUM_K
        {
            STRLEN len;
-           DBM_ckFilter($arg, filter_store_key, \"filter_store_key\");
+           DBM_ckFilter($arg, filter[store_key], \"filter_store_key\");
            $var.dptr = SvPVbyte($arg, len);
            $var.dsize = (int)len;
        }
 T_DATUM_V
-        DBM_ckFilter($arg, filter_store_value, \"filter_store_value\");
+        DBM_ckFilter($arg, filter[store_value], \"filter_store_value\");
        if (SvOK($arg)) {
            STRLEN len;
            $var.dptr = SvPVbyte($arg, len);
@@ -37,10 +37,10 @@ T_GDATUM
 OUTPUT
 T_DATUM_K
        sv_setpvn($arg, (char *)$var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_key, \"filter_fetch_key\");
+       DBM_ckFilter($arg, filter[fetch_key], \"filter_fetch_key\");
 T_DATUM_V
        sv_setpvn($arg, (char *)$var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_value, \"filter_fetch_value\");
+       DBM_ckFilter($arg, filter[fetch_value], \"filter_fetch_value\");
 T_GDATUM
        sv_usepvn($arg, $var.dptr, $var.dsize);
 T_PTROBJ
diff --git a/ext/ODBM_File/ODBM_File.xs b/ext/ODBM_File/ODBM_File.xs
index 8faf4a9..463f8e8 100644
--- a/ext/ODBM_File/ODBM_File.xs
+++ b/ext/ODBM_File/ODBM_File.xs
@@ -37,12 +37,14 @@ datum       nextkey(datum key);
 
 #include <fcntl.h>
 
+#define fetch_key 0
+#define store_key 1
+#define fetch_value 2
+#define store_value 3
+
 typedef struct {
        void *  dbp ;
-       SV *    filter_fetch_key ;
-       SV *    filter_store_key ;
-       SV *    filter_fetch_value ;
-       SV *    filter_store_value ;
+       SV *    filter[4];
        int     filtering ;
        } ODBM_File_type;
 
@@ -107,8 +109,7 @@ odbm_TIEHASH(dbtype, filename, flags, mode)
                    croak("ODBM_FILE: Can't open %s", filename);
            }
            dbp = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
-           RETVAL = (ODBM_File)safemalloc(sizeof(ODBM_File_type)) ;
-           Zero(RETVAL, 1, ODBM_File_type) ;
+           RETVAL = (ODBM_File)safecalloc(1, sizeof(ODBM_File_type));
            RETVAL->dbp = dbp ;
            ST(0) = sv_mortalcopy(&PL_sv_undef);
            sv_setptrobj(ST(0), RETVAL, dbtype);
@@ -119,17 +120,14 @@ DESTROY(db)
        ODBM_File       db
        PREINIT:
        dMY_CXT;
+       int i = store_value;
        CODE:
        dbmrefcnt--;
        dbmclose();
-       if (db->filter_fetch_key)
-           SvREFCNT_dec(db->filter_fetch_key) ;
-       if (db->filter_store_key)
-           SvREFCNT_dec(db->filter_store_key) ;
-       if (db->filter_fetch_value)
-           SvREFCNT_dec(db->filter_fetch_value) ;
-       if (db->filter_store_value)
-           SvREFCNT_dec(db->filter_store_value) ;
+       do {
+           if (db->filter[i])
+               SvREFCNT_dec(db->filter[i]);
+       } while (i-- > 0);
        safefree(db);
 
 datum_value
@@ -190,30 +188,10 @@ filter_fetch_key(db, code)
        ODBM_File       db
        SV *            code
        SV *            RETVAL = &PL_sv_undef ;
+       ALIAS:
+       ODBM_File::filter_fetch_key = fetch_key
+       ODBM_File::filter_store_key = store_key
+       ODBM_File::filter_fetch_value = fetch_value
+       ODBM_File::filter_store_value = store_value
        CODE:
-           DBM_setFilter(db->filter_fetch_key, code) ;
-
-SV *
-filter_store_key(db, code)
-       ODBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_key, code) ;
-
-SV *
-filter_fetch_value(db, code)
-       ODBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_fetch_value, code) ;
-
-SV *
-filter_store_value(db, code)
-       ODBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_value, code) ;
-
+           DBM_setFilter(db->filter[ix], code);
diff --git a/ext/ODBM_File/typemap b/ext/ODBM_File/typemap
index 68313c3..d1f16b4 100644
--- a/ext/ODBM_File/typemap
+++ b/ext/ODBM_File/typemap
@@ -18,7 +18,7 @@ INPUT
 T_DATUM_K
        {
            STRLEN len;
-           DBM_ckFilter($arg, filter_store_key, \"filter_store_key\");
+           DBM_ckFilter($arg, filter[store_key], \"filter_store_key\");
            $var.dptr = SvPVbyte($arg, len);
            $var.dsize = (int)len;
        }
@@ -26,9 +26,9 @@ T_DATUM_K_C
        {
            SV * tmpSV ;
            STRLEN len;
-           if (db->filter_store_key){
+           if (db->filter[store_key]){
                tmpSV = sv_2mortal(newSVsv($arg));
-               DBM_ckFilter(tmpSV, filter_store_key, \"filter_store_key\");
+               DBM_ckFilter(tmpSV, filter[store_key], \"filter_store_key\");
            }
            else
                tmpSV = $arg;
@@ -36,7 +36,7 @@ T_DATUM_K_C
            $var.dsize = (int)len;
        }
 T_DATUM_V
-        DBM_ckFilter($arg, filter_store_value, \"filter_store_value\");
+        DBM_ckFilter($arg, filter[store_value], \"filter_store_value\");
        if (SvOK($arg)) {
            STRLEN len;
            $var.dptr = SvPVbyte($arg, len);
@@ -51,9 +51,9 @@ T_GDATUM
 OUTPUT
 T_DATUM_K
        sv_setpvn($arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+       DBM_ckFilter($arg, filter[fetch_key],\"filter_fetch_key\");
 T_DATUM_V
        sv_setpvn($arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
+       DBM_ckFilter($arg, filter[fetch_value],\"filter_fetch_value\");
 T_GDATUM
        sv_usepvn($arg, $var.dptr, $var.dsize);
diff --git a/ext/SDBM_File/SDBM_File.xs b/ext/SDBM_File/SDBM_File.xs
index 6aafb6b..23d86b5 100644
--- a/ext/SDBM_File/SDBM_File.xs
+++ b/ext/SDBM_File/SDBM_File.xs
@@ -4,12 +4,14 @@
 #include "XSUB.h"
 #include "sdbm/sdbm.h"
 
+#define fetch_key 0
+#define store_key 1
+#define fetch_value 2
+#define store_value 3
+
 typedef struct {
        DBM *   dbp ;
-       SV *    filter_fetch_key ;
-       SV *    filter_store_key ;
-       SV *    filter_fetch_value ;
-       SV *    filter_store_value ;
+       SV *    filter[4];
        int     filtering ;
        } SDBM_File_type;
 
@@ -40,8 +42,7 @@ sdbm_TIEHASH(dbtype, filename, flags, mode)
 
            RETVAL = NULL ;
            if ((dbp = sdbm_open(filename,flags,mode))) {
-               RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
-               Zero(RETVAL, 1, SDBM_File_type) ;
+               RETVAL = (SDBM_File)safecalloc(1, sizeof(SDBM_File_type));
                RETVAL->dbp = dbp ;
            }
            
@@ -54,15 +55,12 @@ sdbm_DESTROY(db)
        SDBM_File       db
        CODE:
        if (db) {
+           int i = store_value;
            sdbm_close(db->dbp);
-           if (db->filter_fetch_key)
-               SvREFCNT_dec(db->filter_fetch_key) ;
-           if (db->filter_store_key)
-               SvREFCNT_dec(db->filter_store_key) ;
-           if (db->filter_fetch_value)
-               SvREFCNT_dec(db->filter_fetch_value) ;
-           if (db->filter_store_value)
-               SvREFCNT_dec(db->filter_store_value) ;
+           do {
+               if (db->filter[i])
+                   SvREFCNT_dec(db->filter[i]);
+           } while (i-- > 0);
            safefree(db) ;
        }
 
@@ -127,30 +125,10 @@ filter_fetch_key(db, code)
        SDBM_File       db
        SV *            code
        SV *            RETVAL = &PL_sv_undef ;
+       ALIAS:
+       SDBM_File::filter_fetch_key = fetch_key
+       SDBM_File::filter_store_key = store_key
+       SDBM_File::filter_fetch_value = fetch_value
+       SDBM_File::filter_store_value = store_value
        CODE:
-           DBM_setFilter(db->filter_fetch_key, code) ;
-
-SV *
-filter_store_key(db, code)
-       SDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_key, code) ;
-
-SV *
-filter_fetch_value(db, code)
-       SDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_fetch_value, code) ;
-
-SV *
-filter_store_value(db, code)
-       SDBM_File       db
-       SV *            code
-       SV *            RETVAL =  &PL_sv_undef ;
-       CODE:
-           DBM_setFilter(db->filter_store_value, code) ;
-
+           DBM_setFilter(db->filter[ix], code);
diff --git a/ext/SDBM_File/typemap b/ext/SDBM_File/typemap
index a06ce81..d1fc497 100644
--- a/ext/SDBM_File/typemap
+++ b/ext/SDBM_File/typemap
@@ -17,12 +17,12 @@ INPUT
 T_DATUM_K
        {
            STRLEN len;
-           DBM_ckFilter($arg, filter_store_key, \"filter_store_key\");
+           DBM_ckFilter($arg, filter[store_key], \"filter_store_key\");
            $var.dptr = SvPVbyte($arg, len);
            $var.dsize = (int)len;
        }
 T_DATUM_V
-        DBM_ckFilter($arg, filter_store_value, \"filter_store_value\");
+        DBM_ckFilter($arg, filter[store_value], \"filter_store_value\");
        if (SvOK($arg)) {
            STRLEN len;
            $var.dptr = SvPVbyte($arg, len);
@@ -37,10 +37,10 @@ T_GDATUM
 OUTPUT
 T_DATUM_K
        sv_setpvn($arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+       DBM_ckFilter($arg, filter[fetch_key],\"filter_fetch_key\");
 T_DATUM_V
        sv_setpvn($arg, $var.dptr, $var.dsize);
-       DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
+       DBM_ckFilter($arg, filter[fetch_value],\"filter_fetch_value\");
 T_GDATUM
        sv_usepvn($arg, $var.dptr, $var.dsize);
 T_PTROBJ

--
Perl5 Master Repository

Reply via email to