arraybuffer 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54a97a398cfc2dba3f1e7be91ad4270c5cda76d80d3a537e928f55c69a5a884d
4
- data.tar.gz: 89a6d372984df0af25cc325f9df08819eb28f1b04a49998226f4efccb425ff4c
3
+ metadata.gz: 82dc4ee3054dbbe61e080e0ea27591f92cf50e20b1cfd4259915a97b796e6b3e
4
+ data.tar.gz: 17200f6002a0b1ace4e94de035fc1b3eebbce01559e0cea0e96c1125ef4a1e9d
5
5
  SHA512:
6
- metadata.gz: 4cc867ac7554a8da0df51f40609f53e3fef3ab4b41d3b53252910330cc12f80959d41cfeaab2b1ac64476eaa48da7df1664f9d01f54928d67a7f6d2b0d172bb2
7
- data.tar.gz: 9db2cf2cde11394abd9cb850d02a156658e0a770ae230f2104fce0697382459199b040829b54f9dff37e31409e2c2944883201c9a014b47b41f24e3f74836c24
6
+ metadata.gz: aba9d04396abf1eeb40561d0801399cdc49b917e3c7a3c44f23fa580c17fde9dfdc8f77258ccba2adeaf24cb3d6cd2c6bb2206edf60f301b714d5750a6748c0a
7
+ data.tar.gz: 9be6cb003e01b9f3a14e04c0e69e68f52390fc5efe8c8c35144d51b85e8946dfa24fb0b9cda8693c49ad935b797aeffee6830e5954cf1c85df4a7101c8855302
@@ -2,6 +2,10 @@
2
2
  #include "extconf.h"
3
3
  #include <string.h>
4
4
 
5
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
6
+ #include <ruby/memory_view.h>
7
+ #endif
8
+
5
9
  extern VALUE cArrayBuffer;
6
10
 
7
11
  #define DECLAREBB(self) \
@@ -12,15 +16,43 @@ extern VALUE cArrayBuffer;
12
16
  rb_raise(rb_eArgError, "Index out of bounds: %d", (idx)); \
13
17
  }
14
18
 
19
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
20
+ static bool
21
+ r_bb_mv_get(VALUE self, rb_memory_view_t *view, int flags) {
22
+ DECLAREBB(self);
23
+ if (!bb->size)
24
+ return 0;
25
+ rb_memory_view_init_as_byte_array(view, self, bb->ptr, (const ssize_t)bb->size, 0);
26
+ return 1;
27
+ }
28
+
29
+ // static bool
30
+ // r_bb_mv_release(VALUE self, rb_memory_view_t *view) {
31
+ // return 1;
32
+ // }
33
+
34
+ static bool
35
+ r_bb_mv_available_p(VALUE self) {
36
+ DECLAREBB(self);
37
+ return bb->size > 0 ? 1 : 0;
38
+ }
39
+
40
+ static rb_memory_view_entry_t cArrayBufferMemoryView = {
41
+ r_bb_mv_get,
42
+ NULL, // r_bb_mv_release,
43
+ r_bb_mv_available_p
44
+ };
45
+ #endif
46
+
15
47
  static void
16
48
  t_bb_gc_mark(struct LLC_ArrayBuffer *bb) {
49
+ if (bb->backing_str) {
50
+ rb_gc_mark(bb->backing_str);
51
+ }
17
52
  }
18
53
 
19
54
  static void
20
55
  t_bb_free(struct LLC_ArrayBuffer *bb) {
21
- if (bb->ptr)
22
- xfree(bb->ptr);
23
-
24
56
  xfree(bb);
25
57
  }
26
58
 
@@ -29,18 +61,37 @@ t_bb_allocator(VALUE klass) {
29
61
  struct LLC_ArrayBuffer *bb = (struct LLC_ArrayBuffer*)xmalloc(sizeof(struct LLC_ArrayBuffer));
30
62
  bb->ptr = NULL;
31
63
  bb->size = 0;
64
+ bb->backing_str = NULL;
32
65
 
33
66
  return Data_Wrap_Struct(klass, t_bb_gc_mark, t_bb_free, bb);
34
67
  }
35
68
 
69
+ #define BB_BACKING_PTR(bb) \
70
+ (FL_TEST((bb)->backing_str, RSTRING_NOEMBED) ? RSTRING((bb)->backing_str)->as.heap.ptr : &RSTRING(bb->backing_str)->as.ary)
71
+
72
+ static void
73
+ t_bb_reassign_ptr(struct LLC_ArrayBuffer *bb) {
74
+ if (!bb->backing_str) {
75
+ bb->ptr = NULL;
76
+ return;
77
+ }
78
+
79
+ rb_str_set_len(bb->backing_str, bb->size);
80
+ bb->ptr = BB_BACKING_PTR(bb);
81
+ bb->ptr[bb->size] = 0;
82
+ }
83
+
36
84
  static VALUE
37
85
  t_bb_initialize(VALUE self, VALUE size) {
38
86
  DECLAREBB(self);
39
87
  unsigned int s = NUM2UINT(size);
40
88
  bb->size = s;
41
- if (bb->ptr)
42
- xfree(bb->ptr);
43
- bb->ptr = xmalloc(s);
89
+ if (bb->backing_str)
90
+ rb_gc_mark(bb->backing_str);
91
+
92
+ bb->backing_str = rb_str_buf_new(s);
93
+
94
+ t_bb_reassign_ptr(bb);
44
95
  memset(bb->ptr, 0, (size_t)s);
45
96
  return self;
46
97
  }
@@ -96,31 +147,9 @@ t_bb_realloc(VALUE self, VALUE _new_size) {
96
147
  if (new_size == bb->size)
97
148
  return self;
98
149
 
99
- void *old_ptr = (void*)bb->ptr;
100
- if (new_size > 0) {
101
- char *new_ptr = (void*)xmalloc(new_size);
102
- if (old_ptr) {
103
- if (new_size > bb->size) {
104
- size_t diff = (size_t)(new_size - bb->size);
105
- memcpy(new_ptr, old_ptr, (size_t)bb->size);
106
- xfree(old_ptr);
107
- old_ptr = NULL;
108
- memset((char*)new_ptr + (size_t)bb->size, 0, diff);
109
- } else {
110
- memcpy(new_ptr, old_ptr, (size_t)new_size);
111
- }
112
- } else {
113
- memset(new_ptr, 0, new_size);
114
- }
115
- bb->size = new_size;
116
- bb->ptr = (unsigned char*)new_ptr;
117
- } else {
118
- bb->size = 0;
119
- bb->ptr = NULL;
120
- }
121
-
122
- if (old_ptr)
123
- xfree(old_ptr);
150
+ rb_str_resize(bb->backing_str, new_size);
151
+ bb->size = new_size;
152
+ t_bb_reassign_ptr(bb);
124
153
 
125
154
  return self;
126
155
  }
@@ -128,8 +157,8 @@ t_bb_realloc(VALUE self, VALUE _new_size) {
128
157
  /*
129
158
  * Returns a ASCII-8BIT string with the contents of the buffer
130
159
  *
131
- * The returned string is a copy of the buffer. It's encoding is always
132
- * ASCII-8BIT.
160
+ * The returned string is the backing string of the buffer.
161
+ * It's encoding is always ASCII-8BIT.
133
162
  * If the buffer has size zero, an empty string is returned.
134
163
  *
135
164
  * @return [String]
@@ -137,9 +166,7 @@ t_bb_realloc(VALUE self, VALUE _new_size) {
137
166
  static VALUE
138
167
  t_bb_bytes(VALUE self) {
139
168
  DECLAREBB(self);
140
- return rb_tainted_str_new(
141
- (const char*)bb->ptr,
142
- bb->size);
169
+ return bb->backing_str;
143
170
  }
144
171
 
145
172
  void
@@ -156,4 +183,9 @@ Init_arraybuffer() {
156
183
  rb_define_method(cArrayBuffer, "each", t_bb_each, 0);
157
184
  rb_define_method(cArrayBuffer, "realloc", t_bb_realloc, 1);
158
185
  rb_define_method(cArrayBuffer, "bytes", t_bb_bytes, 0);
186
+ rb_define_method(cArrayBuffer, "to_s", t_bb_bytes, 0);
187
+
188
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
189
+ rb_memory_view_register(cArrayBuffer, &cArrayBufferMemoryView);
190
+ #endif
159
191
  }
@@ -6,6 +6,7 @@
6
6
  struct LLC_ArrayBuffer {
7
7
  unsigned char *ptr;
8
8
  unsigned int size;
9
+ VALUE backing_str;
9
10
  };
10
11
 
11
12
  #endif
@@ -6,6 +6,10 @@
6
6
  #include <string.h>
7
7
  #endif
8
8
 
9
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
10
+ #include <ruby/memory_view.h>
11
+ #endif
12
+
9
13
  extern VALUE cArrayBuffer;
10
14
  extern VALUE cDataView;
11
15
 
@@ -42,6 +46,39 @@ t_dv_allocator(VALUE klass) {
42
46
  return Data_Wrap_Struct(klass, t_dv_gc_mark, t_dv_free, dv);
43
47
  }
44
48
 
49
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
50
+ static bool
51
+ r_dv_mv_get(VALUE self, rb_memory_view_t *view, int flags) {
52
+ DECLAREDV(self);
53
+ if (!dv->size)
54
+ return 0;
55
+
56
+ DECLAREBB(dv->bb_obj);
57
+
58
+ char *ptr = (char*)bb->ptr + (size_t)dv->offset;
59
+
60
+ rb_memory_view_init_as_byte_array(view, self, ptr, (const ssize_t)dv->size, 0);
61
+ return 1;
62
+ }
63
+
64
+ // static bool
65
+ // r_dv_mv_release(VALUE self, rb_memory_view_t *view) {
66
+ // return 1;
67
+ // }
68
+
69
+ static bool
70
+ r_dv_mv_available_p(VALUE self) {
71
+ DECLAREDV(self);
72
+ return dv->size > 0 ? 1 : 0;
73
+ }
74
+
75
+ static rb_memory_view_entry_t cDataViewMemoryView = {
76
+ r_dv_mv_get,
77
+ NULL, // r_dv_mv_release,
78
+ r_dv_mv_available_p
79
+ };
80
+ #endif
81
+
45
82
  /*
46
83
  * call-seq:
47
84
  * initialize(buffer, offset, size, endianess:)
@@ -488,6 +525,17 @@ t_dv_setbytes(VALUE self, VALUE index, VALUE bytes) {
488
525
  return self;
489
526
  }
490
527
 
528
+ VALUE
529
+ t_dv_to_s(VALUE self) {
530
+ DECLAREDV(self);
531
+ DECLAREBB(dv->bb_obj);
532
+
533
+ const char *ptr = (const char*)bb->ptr + (size_t)dv->offset;
534
+ size_t len = (size_t)dv->size;
535
+
536
+ return rb_str_new(ptr, len);
537
+ }
538
+
491
539
  void
492
540
  Init_dataview() {
493
541
  idEndianess = rb_intern("endianess");
@@ -520,4 +568,10 @@ Init_dataview() {
520
568
  rb_define_method(cDataView, "size", t_dv_size, 0);
521
569
  rb_define_alias(cDataView, "length", "size");
522
570
  rb_define_method(cDataView, "each", t_dv_each, 0);
571
+
572
+ rb_define_method(cDataView, "to_s", t_dv_to_s, 0);
573
+
574
+ #ifdef HAVE_RUBY_MEMORY_VIEW_H
575
+ rb_memory_view_register(cDataView, &cDataViewMemoryView);
576
+ #endif
523
577
  }
@@ -3,5 +3,9 @@ require 'mkmf'
3
3
 
4
4
  # preparation for compilation goes here
5
5
 
6
+ if have_header("ruby/memory_view.h")
7
+ have_type("rb_memory_view_t", ["ruby/memory_view.h"])
8
+ end
9
+
6
10
  create_header
7
11
  create_makefile 'arraybuffer_ext'
data/extconf.h CHANGED
@@ -1,3 +1,5 @@
1
1
  #ifndef EXTCONF_H
2
2
  #define EXTCONF_H
3
+ #define HAVE_RUBY_MEMORY_VIEW_H 1
4
+ #define HAVE_TYPE_RB_MEMORY_VIEW_T 1
3
5
  #endif
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arraybuffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Diego Piske
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-24 00:00:00.000000000 Z
11
+ date: 2021-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.9'
27
- description:
27
+ description:
28
28
  email:
29
29
  - andrepiske@gmail.com
30
30
  executables: []
@@ -45,7 +45,7 @@ licenses:
45
45
  - MIT
46
46
  metadata:
47
47
  source_code_uri: https://github.com/andrepiske/rb-arraybuffer
48
- post_install_message:
48
+ post_install_message:
49
49
  rdoc_options: []
50
50
  require_paths:
51
51
  - lib
@@ -60,8 +60,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  requirements: []
63
- rubygems_version: 3.1.2
64
- signing_key:
63
+ rubygems_version: 3.2.21
64
+ signing_key:
65
65
  specification_version: 4
66
66
  summary: An array buffer (a.k.a. byte array) implementation forRuby, implemented natively.
67
67
  test_files: []