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 +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: []
|