diff options
author | Lars Kanis <lars@greiz-reinsdorf.de> | 2023-03-03 13:38:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-03 13:38:27 +0100 |
commit | 3d57a903f2a47fa735e2985a93f11680af2c0eee (patch) | |
tree | 39357183392fb7f6564090be6933af837ee79feb | |
parent | 227d1ce472ec90144249f8cf85b52d85cbab925c (diff) | |
parent | b5bcfcada846db990e46ad9d990ec18ccbc7cab5 (diff) | |
download | ffi-3d57a903f2a47fa735e2985a93f11680af2c0eee.tar.gz |
Merge pull request #994 from casperisfine/typed-data-variadic
Convert FFI::VariadicInvoker to TypedData
-rw-r--r-- | ext/ffi_c/Variadic.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/ext/ffi_c/Variadic.c b/ext/ffi_c/Variadic.c index 8ad38b1..cb60040 100644 --- a/ext/ffi_c/Variadic.c +++ b/ext/ffi_c/Variadic.c @@ -62,20 +62,29 @@ typedef struct VariadicInvoker_ { bool blocking; } VariadicInvoker; - static VALUE variadic_allocate(VALUE klass); static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options); -static void variadic_mark(VariadicInvoker *); +static void variadic_mark(void *); static VALUE classVariadicInvoker = Qnil; +static const rb_data_type_t variadic_data_type = { + .wrap_struct_name = "FFI::VariadicInvoker", + .function = { + .dmark = variadic_mark, + .dfree = RUBY_TYPED_DEFAULT_FREE, + .dsize = NULL, + }, + .flags = RUBY_TYPED_FREE_IMMEDIATELY +}; + static VALUE variadic_allocate(VALUE klass) { VariadicInvoker *invoker; - VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker); + VALUE obj = TypedData_Make_Struct(klass, VariadicInvoker, &variadic_data_type, invoker); invoker->rbAddress = Qnil; invoker->rbEnums = Qnil; @@ -86,8 +95,9 @@ variadic_allocate(VALUE klass) } static void -variadic_mark(VariadicInvoker *invoker) +variadic_mark(void *data) { + VariadicInvoker *invoker = (VariadicInvoker *)data; rb_gc_mark(invoker->rbEnums); rb_gc_mark(invoker->rbAddress); rb_gc_mark(invoker->rbReturnType); @@ -108,7 +118,7 @@ variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE Check_Type(options, T_HASH); convention = rb_hash_aref(options, ID2SYM(rb_intern("convention"))); - Data_Get_Struct(self, VariadicInvoker, invoker); + TypedData_Get_Struct(self, VariadicInvoker, &variadic_data_type, invoker); invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums"))); invoker->rbAddress = rbFunction; invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address; @@ -176,7 +186,7 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues) Check_Type(parameterTypes, T_ARRAY); Check_Type(parameterValues, T_ARRAY); - Data_Get_Struct(self, VariadicInvoker, invoker); + TypedData_Get_Struct(self, VariadicInvoker, &variadic_data_type, invoker); paramCount = (int) RARRAY_LEN(parameterTypes); paramTypes = ALLOCA_N(Type *, paramCount); ffiParamTypes = ALLOCA_N(ffi_type *, paramCount); |