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
