From ad48d998763c7d58ea7a90b00d280125659a74d1 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 4 Oct 2014 23:33:01 +0000 Subject: dbm: typed data * ext/dbm/dbm.c (dbm_type): turn into typed data. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47794 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/dbm/dbm.c | 30 +++++++++++++++++++++++++----- ext/dbm/extconf.rb | 17 +++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) (limited to 'ext') diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c index 527d6518d0..6f64d13690 100644 --- a/ext/dbm/dbm.c +++ b/ext/dbm/dbm.c @@ -46,7 +46,7 @@ closed_dbm(void) } #define GetDBM(obj, dbmp) do {\ - Data_Get_Struct((obj), struct dbmdata, (dbmp));\ + TypedData_Get_Struct((obj), struct dbmdata, &dbm_type, (dbmp));\ if ((dbmp) == 0) closed_dbm();\ if ((dbmp)->di_dbm == 0) closed_dbm();\ } while (0) @@ -57,14 +57,34 @@ closed_dbm(void) } while (0) static void -free_dbm(struct dbmdata *dbmp) +free_dbm(void *ptr) { + struct dbmdata *dbmp = ptr; if (dbmp) { if (dbmp->di_dbm) dbm_close(dbmp->di_dbm); xfree(dbmp); } } +static size_t +memsize_dbm(const void *ptr) +{ + size_t size = 0; + const struct dbmdata *dbmp = ptr; + if (dbmp) { + size += sizeof(*dbmp); + if (dbmp->di_dbm) size += DBM_SIZEOF_DBM; + } + return size; +} + +static const rb_data_type_t dbm_type = { + "dbm", + {0, free_dbm, memsize_dbm,}, + NULL, NULL, + RUBY_TYPED_FREE_IMMEDIATELY, +}; + /* * call-seq: * dbm.close @@ -94,7 +114,7 @@ fdbm_closed(VALUE obj) { struct dbmdata *dbmp; - Data_Get_Struct(obj, struct dbmdata, dbmp); + TypedData_Get_Struct(obj, struct dbmdata, &dbm_type, dbmp); if (dbmp == 0) return Qtrue; if (dbmp->di_dbm == 0) @@ -106,7 +126,7 @@ fdbm_closed(VALUE obj) static VALUE fdbm_alloc(VALUE klass) { - return Data_Wrap_Struct(klass, 0, free_dbm, 0); + return TypedData_Wrap_Struct(klass, &dbm_type, 0); } /* @@ -228,7 +248,7 @@ fdbm_initialize(int argc, VALUE *argv, VALUE obj) static VALUE fdbm_s_open(int argc, VALUE *argv, VALUE klass) { - VALUE obj = Data_Wrap_Struct(klass, 0, free_dbm, 0); + VALUE obj = fdbm_alloc(klass); if (NIL_P(fdbm_initialize(argc, argv, obj))) { return Qnil; diff --git a/ext/dbm/extconf.rb b/ext/dbm/extconf.rb index 68070c9970..2c8caa398e 100644 --- a/ext/dbm/extconf.rb +++ b/ext/dbm/extconf.rb @@ -267,6 +267,23 @@ if dblib.any? {|db| headers.fetch(db, ["ndbm.h"]).any? {|hdr| headers.db_check(d have_func("dbm_pagfno((DBM *)0)", headers.found, headers.defs) have_func("dbm_dirfno((DBM *)0)", headers.found, headers.defs) convertible_int("datum.dsize", headers.found, headers.defs) + checking_for("sizeof(DBM) is available") { + if try_compile(< +#endif +#ifdef HAVE_SYS_CDEFS_H +# include +#endif +#include DBM_HDR + +const int sizeof_DBM = (int)sizeof(DBM); +SRC + $defs << '-DDBM_SIZEOF_DBM=sizeof(DBM)' + else + $defs << '-DDBM_SIZEOF_DBM=0' + end + } create_makefile("dbm") end # :startdoc: -- cgit v1.2.3