arraybuffer 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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: []