From d7b32ffd64cb4248e325732c0e0430c65cddef24 Mon Sep 17 00:00:00 2001 From: suke Date: Tue, 30 Sep 2014 09:47:38 +0000 Subject: * ext/win32ole/win32ole_typelib.c: use typed data. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/win32ole/win32ole_typelib.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'ext/win32ole/win32ole_typelib.c') diff --git a/ext/win32ole/win32ole_typelib.c b/ext/win32ole/win32ole_typelib.c index 9a8fdd56c3..a2058db62a 100644 --- a/ext/win32ole/win32ole_typelib.c +++ b/ext/win32ole/win32ole_typelib.c @@ -9,7 +9,8 @@ static VALUE oletypelib_path(VALUE guid, VALUE version); static HRESULT oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib); static VALUE foletypelib_s_typelibs(VALUE self); static VALUE oletypelib_set_member(VALUE self, ITypeLib *pTypeLib); -static void oletypelib_free(struct oletypelibdata *poletypelib); +static void oletypelib_free(void *ptr); +static size_t oletypelib_size(const void *ptr); static VALUE foletypelib_s_allocate(VALUE klass); static VALUE oletypelib_search_registry(VALUE self, VALUE typelib); static void oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr); @@ -30,6 +31,12 @@ static VALUE typelib_file_from_clsid(VALUE ole); static VALUE foletypelib_ole_types(VALUE self); static VALUE foletypelib_inspect(VALUE self); +static const rb_data_type_t oletypelib_datatype = { + "win32ole_typelib", + {NULL, oletypelib_free, oletypelib_size,}, + NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY +}; + static VALUE reg_get_typelib_file_path(HKEY hkey) { @@ -99,7 +106,7 @@ ITypeLib * itypelib(VALUE self) { struct oletypelibdata *ptlib; - Data_Get_Struct(self, struct oletypelibdata, ptlib); + TypedData_Get_Struct(self, struct oletypelibdata, &oletypelib_datatype, ptlib); return ptlib->pTypeLib; } @@ -182,25 +189,32 @@ static VALUE oletypelib_set_member(VALUE self, ITypeLib *pTypeLib) { struct oletypelibdata *ptlib; - Data_Get_Struct(self, struct oletypelibdata, ptlib); + TypedData_Get_Struct(self, struct oletypelibdata, &oletypelib_datatype, ptlib); ptlib->pTypeLib = pTypeLib; return self; } static void -oletypelib_free(struct oletypelibdata *poletypelib) +oletypelib_free(void *ptr) { + struct oletypelibdata *poletypelib = ptr; OLE_FREE(poletypelib->pTypeLib); free(poletypelib); } +static size_t +oletypelib_size(const void *ptr) +{ + return ptr ? sizeof(struct oletypelibdata) : 0; +} + static VALUE foletypelib_s_allocate(VALUE klass) { struct oletypelibdata *poletypelib; VALUE obj; ole_initialize(); - obj = Data_Make_Struct(klass, struct oletypelibdata, 0, oletypelib_free, poletypelib); + obj = TypedData_Make_Struct(klass, struct oletypelibdata, &oletypelib_datatype, poletypelib); poletypelib->pTypeLib = NULL; return obj; } -- cgit v1.2.3