summaryrefslogtreecommitdiff
path: root/memory_view.c
diff options
context:
space:
mode:
Diffstat (limited to 'memory_view.c')
-rw-r--r--memory_view.c31
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__");