@@ -36,12 +36,25 @@ fiddle_memview_mark(void *ptr)
36
36
}
37
37
38
38
static void
39
- fiddle_memview_free ( void * ptr )
39
+ fiddle_memview_release ( struct memview_data * data )
40
40
{
41
- struct memview_data * data = ptr ;
41
+ if (NIL_P (data -> view .obj )) return ;
42
+
42
43
rb_memory_view_release (& data -> view );
43
- if (data -> members )
44
+ data -> view .obj = Qnil ;
45
+ data -> view .byte_size = 0 ;
46
+ if (data -> members ) {
44
47
xfree (data -> members );
48
+ data -> members = NULL ;
49
+ data -> n_members = 0 ;
50
+ }
51
+ }
52
+
53
+ static void
54
+ fiddle_memview_free (void * ptr )
55
+ {
56
+ struct memview_data * data = ptr ;
57
+ fiddle_memview_release (data );
45
58
xfree (ptr );
46
59
}
47
60
@@ -63,11 +76,32 @@ rb_fiddle_memview_s_allocate(VALUE klass)
63
76
struct memview_data * data ;
64
77
VALUE obj = TypedData_Make_Struct (klass , struct memview_data , & fiddle_memview_data_type , data );
65
78
data -> view .obj = Qnil ;
79
+ data -> view .byte_size = 0 ;
66
80
data -> members = NULL ;
67
81
data -> n_members = 0 ;
68
82
return obj ;
69
83
}
70
84
85
+ static VALUE
86
+ rb_fiddle_memview_release (VALUE obj )
87
+ {
88
+ struct memview_data * data ;
89
+ TypedData_Get_Struct (obj , struct memview_data , & fiddle_memview_data_type , data );
90
+
91
+ if (NIL_P (data -> view .obj )) return Qnil ;
92
+ fiddle_memview_release (data );
93
+ return Qnil ;
94
+ }
95
+
96
+ static VALUE
97
+ rb_fiddle_memview_s_export (VALUE klass , VALUE target )
98
+ {
99
+ ID id_new ;
100
+ CONST_ID (id_new , "new" );
101
+ VALUE memview = rb_funcall (klass , id_new , 1 , target );
102
+ return rb_ensure (rb_yield , memview , rb_fiddle_memview_release , memview );
103
+ }
104
+
71
105
static VALUE
72
106
rb_fiddle_memview_initialize (VALUE obj , VALUE target )
73
107
{
@@ -269,7 +303,9 @@ Init_fiddle_memory_view(void)
269
303
{
270
304
rb_cMemoryView = rb_define_class_under (mFiddle , "MemoryView" , rb_cObject );
271
305
rb_define_alloc_func (rb_cMemoryView , rb_fiddle_memview_s_allocate );
306
+ rb_define_singleton_method (rb_cMemoryView , "export" , rb_fiddle_memview_s_export , 1 );
272
307
rb_define_method (rb_cMemoryView , "initialize" , rb_fiddle_memview_initialize , 1 );
308
+ rb_define_method (rb_cMemoryView , "release" , rb_fiddle_memview_release , 0 );
273
309
rb_define_method (rb_cMemoryView , "obj" , rb_fiddle_memview_get_obj , 0 );
274
310
rb_define_method (rb_cMemoryView , "byte_size" , rb_fiddle_memview_get_byte_size , 0 );
275
311
rb_define_method (rb_cMemoryView , "readonly?" , rb_fiddle_memview_get_readonly , 0 );
0 commit comments