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 +4 -4
- data/ext/arraybuffer/arraybuffer.c +68 -36
- data/ext/arraybuffer/arraybuffer.h +1 -0
- data/ext/arraybuffer/dataview.c +54 -0
- data/ext/arraybuffer/extconf.rb +4 -0
- data/extconf.h +2 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82dc4ee3054dbbe61e080e0ea27591f92cf50e20b1cfd4259915a97b796e6b3e
|
4
|
+
data.tar.gz: 17200f6002a0b1ace4e94de035fc1b3eebbce01559e0cea0e96c1125ef4a1e9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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->
|
42
|
-
|
43
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
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
|
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
|
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
|
}
|
data/ext/arraybuffer/dataview.c
CHANGED
@@ -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
|
}
|
data/ext/arraybuffer/extconf.rb
CHANGED
data/extconf.h
CHANGED
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
|
+
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:
|
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.
|
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: []
|