summaryrefslogtreecommitdiff
path: root/ext/ffi_c/DynamicLibrary.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ffi_c/DynamicLibrary.c')
-rw-r--r--ext/ffi_c/DynamicLibrary.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/ext/ffi_c/DynamicLibrary.c b/ext/ffi_c/DynamicLibrary.c
index 78b3de6..eb55fc2 100644
--- a/ext/ffi_c/DynamicLibrary.c
+++ b/ext/ffi_c/DynamicLibrary.c
@@ -54,13 +54,25 @@ typedef struct LibrarySymbol_ {
VALUE name;
} LibrarySymbol;
+
static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags);
static void library_free(Library* lib);
static VALUE symbol_allocate(VALUE klass);
static VALUE symbol_new(VALUE library, void* address, VALUE name);
-static void symbol_mark(LibrarySymbol* sym);
+static void symbol_mark(void *data);
+
+static const rb_data_type_t library_symbol_data_type = {
+ .wrap_struct_name = "FFI::DynamicLibrary::Symbol",
+ .function = {
+ .dmark = symbol_mark,
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
+ .dsize = NULL,
+ },
+ .parent = &rbffi_pointer_data_type,
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
+};
static VALUE LibraryClass = Qnil, SymbolClass = Qnil;
@@ -198,7 +210,7 @@ static VALUE
symbol_allocate(VALUE klass)
{
LibrarySymbol* sym;
- VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym);
+ VALUE obj = TypedData_Make_Struct(klass, LibrarySymbol, &library_symbol_data_type, sym);
sym->name = Qnil;
sym->library = Qnil;
sym->base.rbParent = Qnil;
@@ -224,7 +236,7 @@ static VALUE
symbol_new(VALUE library, void* address, VALUE name)
{
LibrarySymbol* sym;
- VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym);
+ VALUE obj = TypedData_Make_Struct(SymbolClass, LibrarySymbol, &library_symbol_data_type, sym);
sym->base.memory.address = address;
sym->base.memory.size = LONG_MAX;
@@ -237,8 +249,9 @@ symbol_new(VALUE library, void* address, VALUE name)
}
static void
-symbol_mark(LibrarySymbol* sym)
+symbol_mark(void *data)
{
+ LibrarySymbol *sym = (LibrarySymbol *)data;
rb_gc_mark(sym->library);
rb_gc_mark(sym->name);
}
@@ -254,7 +267,7 @@ symbol_inspect(VALUE self)
LibrarySymbol* sym;
char buf[256];
- Data_Get_Struct(self, LibrarySymbol, sym);
+ TypedData_Get_Struct(self, LibrarySymbol, &library_symbol_data_type, sym);
snprintf(buf, sizeof(buf), "#<FFI::Library::Symbol name=%s address=%p>",
StringValueCStr(sym->name), sym->base.memory.address);
return rb_str_new2(buf);