diff options
Diffstat (limited to 'memory_view.c')
-rw-r--r-- | memory_view.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/memory_view.c b/memory_view.c index b08f13e286..519aad2ca1 100644 --- a/memory_view.c +++ b/memory_view.c @@ -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 }; @@ -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__"); |