summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorSutou Kouhei <kou@cozmixng.org>2021-05-20 06:29:26 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-07-13 19:37:45 +0900
commit9988f6ac4e887437b5a76f0a1c27fa6f5c17c039 (patch)
tree9138dc2aadf8db88f2622e80ff338dee43f38e50 /ext
parent8c905349bb35fa4c21614272f8e23da646e94957 (diff)
[ruby/fiddle] Add Fiddle::MemoryView#to_s (https://github.com/ruby/fiddle/pull/78)
Fix https://github.com/ruby/fiddle/pull/74 Reported by dsisnero. Thanks!!!
Diffstat (limited to 'ext')
-rw-r--r--ext/fiddle/memory_view.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/ext/fiddle/memory_view.c b/ext/fiddle/memory_view.c
index 172b1f18fc..2a9f45feea 100644
--- a/ext/fiddle/memory_view.c
+++ b/ext/fiddle/memory_view.c
@@ -1,5 +1,6 @@
#include <stdbool.h>
#include <ruby/ruby.h>
+#include <ruby/encoding.h>
#ifdef HAVE_RUBY_MEMORY_VIEW_H
# include <ruby/memory_view.h>
@@ -233,6 +234,36 @@ rb_fiddle_memview_aref(int argc, VALUE *argv, VALUE obj)
return rb_memory_view_extract_item_members(ptr, data->members, data->n_members);
}
+static VALUE
+rb_fiddle_memview_to_s(VALUE self)
+{
+ struct memview_data *data;
+ const char *raw_data;
+ long byte_size;
+ VALUE string;
+
+ TypedData_Get_Struct(self,
+ struct memview_data,
+ &fiddle_memview_data_type,
+ data);
+
+ if (NIL_P(data->view.obj)) {
+ raw_data = NULL;
+ byte_size = 0;
+ } else {
+ raw_data = data->view.data;
+ byte_size = data->view.byte_size;
+ }
+
+ string = rb_enc_str_new_static(raw_data, byte_size, rb_ascii8bit_encoding());
+ {
+ ID id_memory_view;
+ CONST_ID(id_memory_view, "memory_view");
+ rb_ivar_set(string, id_memory_view, self);
+ }
+ return rb_obj_freeze(string);
+}
+
void
Init_fiddle_memory_view(void)
{
@@ -249,6 +280,7 @@ Init_fiddle_memory_view(void)
rb_define_method(rb_cMemoryView, "strides", rb_fiddle_memview_get_strides, 0);
rb_define_method(rb_cMemoryView, "sub_offsets", rb_fiddle_memview_get_sub_offsets, 0);
rb_define_method(rb_cMemoryView, "[]", rb_fiddle_memview_aref, -1);
+ rb_define_method(rb_cMemoryView, "to_s", rb_fiddle_memview_to_s, 0);
}
#endif /* FIDDLE_MEMORY_VIEW */