diff options
Diffstat (limited to 'memory_view.c')
-rw-r--r-- | memory_view.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/memory_view.c b/memory_view.c index 6e422c1476..519aad2ca1 100644 --- a/memory_view.c +++ b/memory_view.c @@ -9,8 +9,8 @@ #include "internal.h" #include "internal/hash.h" #include "internal/variable.h" -#include "internal/util.h" #include "ruby/memory_view.h" +#include "ruby/util.h" #include "vm_sync.h" #if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG @@ -61,9 +61,9 @@ exported_object_registry_free(void *ptr) const rb_data_type_t rb_memory_view_exported_object_registry_data_type = { "memory_view/exported_object_registry", { - exported_object_registry_mark, - exported_object_registry_free, - 0, + exported_object_registry_mark, + exported_object_registry_free, + 0, }, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -108,7 +108,8 @@ static void unregister_exported_object(VALUE obj) { RB_VM_LOCK_ENTER(); - st_update(exported_object_table, (st_data_t)obj, exported_object_dec_ref, 0); + if (exported_object_table) + st_update(exported_object_table, (st_data_t)obj, exported_object_dec_ref, 0); RB_VM_LOCK_LEAVE(); } @@ -119,9 +120,9 @@ static ID id_memory_view; static const rb_data_type_t memory_view_entry_data_type = { "memory_view/entry", { - 0, - 0, - 0, + 0, + 0, + 0, }, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -210,7 +211,7 @@ rb_memory_view_init_as_byte_array(rb_memory_view_t *view, VALUE obj, void *data, view->shape = NULL; view->strides = NULL; view->sub_offsets = NULL; - *((void **)&view->private) = NULL; + view->private_data = NULL; return true; } @@ -783,7 +784,7 @@ lookup_memory_view_entry(VALUE klass) { VALUE entry_obj = rb_ivar_lookup(klass, id_memory_view, Qnil); while (NIL_P(entry_obj)) { - klass = rb_class_get_superclass(klass); + klass = rb_class_superclass(klass); if (klass == rb_cBasicObject || klass == rb_cObject) return NULL; @@ -822,6 +823,7 @@ rb_memory_view_get(VALUE obj, rb_memory_view_t* view, int flags) bool rv = (*entry->get_func)(obj, view, flags); if (rv) { + view->_memory_view_entry = entry; register_exported_object(view->obj); } return rv; @@ -834,8 +836,7 @@ rb_memory_view_get(VALUE obj, rb_memory_view_t* view, int flags) bool rb_memory_view_release(rb_memory_view_t* view) { - VALUE klass = CLASS_OF(view->obj); - const rb_memory_view_entry_t *entry = lookup_memory_view_entry(klass); + const rb_memory_view_entry_t *entry = view->_memory_view_entry; if (entry) { bool rv = true; if (entry->release_func) { @@ -844,9 +845,7 @@ rb_memory_view_release(rb_memory_view_t* view) if (rv) { unregister_exported_object(view->obj); view->obj = Qnil; - if (view->item_desc.components) { - xfree((void *)view->item_desc.components); - } + xfree((void *)view->item_desc.components); } return rv; } @@ -864,7 +863,7 @@ Init_MemoryView(void) VALUE obj = TypedData_Wrap_Struct( 0, &rb_memory_view_exported_object_registry_data_type, exported_object_table); - rb_gc_register_mark_object(obj); + rb_vm_register_global_object(obj); rb_memory_view_exported_object_registry = obj; id_memory_view = rb_intern_const("__memory_view__"); |