msgpack 1.5.6 → 1.8.0
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/ChangeLog +50 -0
- data/README.md +48 -12
- data/ext/java/org/msgpack/jruby/Buffer.java +3 -3
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +11 -20
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +1 -1
- data/ext/java/org/msgpack/jruby/Factory.java +11 -50
- data/ext/java/org/msgpack/jruby/Packer.java +9 -24
- data/ext/java/org/msgpack/jruby/Unpacker.java +15 -32
- data/ext/msgpack/buffer.c +69 -56
- data/ext/msgpack/buffer.h +138 -44
- data/ext/msgpack/buffer_class.c +132 -31
- data/ext/msgpack/buffer_class.h +1 -0
- data/ext/msgpack/extconf.rb +20 -30
- data/ext/msgpack/factory_class.c +75 -86
- data/ext/msgpack/packer.c +13 -16
- data/ext/msgpack/packer.h +24 -21
- data/ext/msgpack/packer_class.c +72 -98
- data/ext/msgpack/packer_class.h +11 -0
- data/ext/msgpack/packer_ext_registry.c +31 -28
- data/ext/msgpack/packer_ext_registry.h +10 -14
- data/ext/msgpack/rbinit.c +1 -1
- data/ext/msgpack/rmem.c +3 -4
- data/ext/msgpack/sysdep.h +5 -2
- data/ext/msgpack/unpacker.c +201 -113
- data/ext/msgpack/unpacker.h +22 -15
- data/ext/msgpack/unpacker_class.c +87 -92
- data/ext/msgpack/unpacker_class.h +11 -0
- data/ext/msgpack/unpacker_ext_registry.c +4 -16
- data/ext/msgpack/unpacker_ext_registry.h +3 -7
- data/lib/msgpack/buffer.rb +9 -0
- data/lib/msgpack/factory.rb +90 -63
- data/lib/msgpack/packer.rb +10 -1
- data/lib/msgpack/unpacker.rb +14 -1
- data/lib/msgpack/version.rb +1 -1
- data/lib/msgpack.rb +1 -0
- data/msgpack.gemspec +8 -3
- metadata +21 -51
- data/.github/workflows/ci.yaml +0 -57
- data/.gitignore +0 -23
- data/.rubocop.yml +0 -36
- data/Gemfile +0 -9
- data/Rakefile +0 -70
- data/appveyor.yml +0 -18
- data/bench/bench.rb +0 -78
- data/doclib/msgpack/buffer.rb +0 -193
- data/doclib/msgpack/core_ext.rb +0 -101
- data/doclib/msgpack/error.rb +0 -19
- data/doclib/msgpack/extension_value.rb +0 -9
- data/doclib/msgpack/factory.rb +0 -145
- data/doclib/msgpack/packer.rb +0 -209
- data/doclib/msgpack/time.rb +0 -22
- data/doclib/msgpack/timestamp.rb +0 -44
- data/doclib/msgpack/unpacker.rb +0 -183
- data/doclib/msgpack.rb +0 -87
- data/msgpack.org.md +0 -46
- data/spec/bigint_spec.rb +0 -26
- data/spec/cases.json +0 -1
- data/spec/cases.msg +0 -0
- data/spec/cases_compact.msg +0 -0
- data/spec/cases_spec.rb +0 -39
- data/spec/cruby/buffer_io_spec.rb +0 -255
- data/spec/cruby/buffer_packer.rb +0 -29
- data/spec/cruby/buffer_spec.rb +0 -575
- data/spec/cruby/buffer_unpacker.rb +0 -19
- data/spec/cruby/unpacker_spec.rb +0 -70
- data/spec/ext_value_spec.rb +0 -99
- data/spec/exttypes.rb +0 -51
- data/spec/factory_spec.rb +0 -688
- data/spec/format_spec.rb +0 -301
- data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
- data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
- data/spec/jruby/unpacker_spec.rb +0 -186
- data/spec/msgpack_spec.rb +0 -214
- data/spec/pack_spec.rb +0 -61
- data/spec/packer_spec.rb +0 -575
- data/spec/random_compat.rb +0 -24
- data/spec/spec_helper.rb +0 -71
- data/spec/timestamp_spec.rb +0 -159
- data/spec/unpack_spec.rb +0 -57
- data/spec/unpacker_spec.rb +0 -859
data/ext/msgpack/buffer_class.c
CHANGED
@@ -21,25 +21,87 @@
|
|
21
21
|
#include "buffer.h"
|
22
22
|
#include "buffer_class.h"
|
23
23
|
|
24
|
-
VALUE cMessagePack_Buffer;
|
24
|
+
VALUE cMessagePack_Buffer = Qnil;
|
25
|
+
VALUE cMessagePack_HeldBuffer = Qnil;
|
25
26
|
|
26
27
|
static ID s_read;
|
27
28
|
static ID s_readpartial;
|
28
29
|
static ID s_write;
|
29
30
|
static ID s_append;
|
30
31
|
static ID s_close;
|
32
|
+
static ID s_at_owner;
|
31
33
|
|
32
34
|
static VALUE sym_read_reference_threshold;
|
33
35
|
static VALUE sym_write_reference_threshold;
|
34
36
|
static VALUE sym_io_buffer_size;
|
35
37
|
|
38
|
+
typedef struct msgpack_held_buffer_t msgpack_held_buffer_t;
|
39
|
+
struct msgpack_held_buffer_t {
|
40
|
+
size_t size;
|
41
|
+
VALUE mapped_strings[];
|
42
|
+
};
|
36
43
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
44
|
+
static void HeldBuffer_mark(void *data)
|
45
|
+
{
|
46
|
+
msgpack_held_buffer_t* held_buffer = (msgpack_held_buffer_t*)data;
|
47
|
+
for (size_t index = 0; index < held_buffer->size; index++) {
|
48
|
+
rb_gc_mark(held_buffer->mapped_strings[index]);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
static size_t HeldBuffer_memsize(const void *data)
|
53
|
+
{
|
54
|
+
const msgpack_held_buffer_t* held_buffer = (msgpack_held_buffer_t*)data;
|
55
|
+
return sizeof(size_t) + sizeof(VALUE) * held_buffer->size;
|
56
|
+
}
|
57
|
+
|
58
|
+
static const rb_data_type_t held_buffer_data_type = {
|
59
|
+
.wrap_struct_name = "msgpack:held_buffer",
|
60
|
+
.function = {
|
61
|
+
.dmark = HeldBuffer_mark,
|
62
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
63
|
+
.dsize = HeldBuffer_memsize,
|
64
|
+
},
|
65
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
66
|
+
};
|
67
|
+
|
68
|
+
VALUE MessagePack_Buffer_hold(msgpack_buffer_t* buffer)
|
69
|
+
{
|
70
|
+
size_t mapped_strings_count = 0;
|
71
|
+
msgpack_buffer_chunk_t* c = buffer->head;
|
72
|
+
while (c != &buffer->tail) {
|
73
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
74
|
+
mapped_strings_count++;
|
75
|
+
}
|
76
|
+
c = c->next;
|
77
|
+
}
|
78
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
79
|
+
mapped_strings_count++;
|
80
|
+
}
|
81
|
+
|
82
|
+
if (mapped_strings_count == 0) {
|
83
|
+
return Qnil;
|
84
|
+
}
|
85
|
+
|
86
|
+
msgpack_held_buffer_t* held_buffer = xmalloc(sizeof(msgpack_held_buffer_t) + mapped_strings_count * sizeof(VALUE));
|
87
|
+
|
88
|
+
c = buffer->head;
|
89
|
+
mapped_strings_count = 0;
|
90
|
+
while (c != &buffer->tail) {
|
91
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
92
|
+
held_buffer->mapped_strings[mapped_strings_count] = c->mapped_string;
|
93
|
+
mapped_strings_count++;
|
94
|
+
}
|
95
|
+
c = c->next;
|
42
96
|
}
|
97
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
98
|
+
held_buffer->mapped_strings[mapped_strings_count] = c->mapped_string;
|
99
|
+
mapped_strings_count++;
|
100
|
+
}
|
101
|
+
held_buffer->size = mapped_strings_count;
|
102
|
+
return TypedData_Wrap_Struct(cMessagePack_HeldBuffer, &held_buffer_data_type, held_buffer);
|
103
|
+
}
|
104
|
+
|
43
105
|
|
44
106
|
#define CHECK_STRING_TYPE(value) \
|
45
107
|
value = rb_check_string_type(value); \
|
@@ -57,12 +119,49 @@ static void Buffer_free(void* data)
|
|
57
119
|
xfree(b);
|
58
120
|
}
|
59
121
|
|
122
|
+
static size_t Buffer_memsize(const void *data)
|
123
|
+
{
|
124
|
+
return sizeof(msgpack_buffer_t) + msgpack_buffer_memsize(data);
|
125
|
+
}
|
126
|
+
|
127
|
+
static const rb_data_type_t buffer_data_type = {
|
128
|
+
.wrap_struct_name = "msgpack:buffer",
|
129
|
+
.function = {
|
130
|
+
.dmark = msgpack_buffer_mark,
|
131
|
+
.dfree = Buffer_free,
|
132
|
+
.dsize = Buffer_memsize,
|
133
|
+
},
|
134
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
135
|
+
};
|
136
|
+
|
137
|
+
static const rb_data_type_t buffer_view_data_type = {
|
138
|
+
.wrap_struct_name = "msgpack:buffer_view",
|
139
|
+
.function = {
|
140
|
+
.dmark = NULL,
|
141
|
+
.dfree = NULL,
|
142
|
+
.dsize = NULL,
|
143
|
+
},
|
144
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
145
|
+
};
|
146
|
+
|
147
|
+
static inline msgpack_buffer_t *MessagePack_Buffer_get(VALUE object)
|
148
|
+
{
|
149
|
+
msgpack_buffer_t *buffer;
|
150
|
+
bool view = RTEST(rb_ivar_get(object, s_at_owner));
|
151
|
+
TypedData_Get_Struct(object, msgpack_buffer_t, view ? &buffer_view_data_type : &buffer_data_type, buffer);
|
152
|
+
if (!buffer) {
|
153
|
+
rb_raise(rb_eArgError, "Uninitialized Buffer object");
|
154
|
+
}
|
155
|
+
return buffer;
|
156
|
+
}
|
157
|
+
|
60
158
|
static VALUE Buffer_alloc(VALUE klass)
|
61
159
|
{
|
62
|
-
msgpack_buffer_t* b
|
160
|
+
msgpack_buffer_t* b;
|
161
|
+
VALUE buffer = TypedData_Make_Struct(klass, msgpack_buffer_t, &buffer_data_type, b);
|
63
162
|
msgpack_buffer_init(b);
|
64
|
-
|
65
|
-
return
|
163
|
+
rb_ivar_set(buffer, s_at_owner, Qnil);
|
164
|
+
return buffer;
|
66
165
|
}
|
67
166
|
|
68
167
|
static ID get_partial_read_method(VALUE io)
|
@@ -113,8 +212,9 @@ void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options
|
|
113
212
|
|
114
213
|
VALUE MessagePack_Buffer_wrap(msgpack_buffer_t* b, VALUE owner)
|
115
214
|
{
|
116
|
-
|
117
|
-
|
215
|
+
VALUE buffer = TypedData_Wrap_Struct(cMessagePack_Buffer, &buffer_view_data_type, b);
|
216
|
+
rb_ivar_set(buffer, s_at_owner, owner);
|
217
|
+
return buffer;
|
118
218
|
}
|
119
219
|
|
120
220
|
static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
@@ -144,7 +244,7 @@ static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
|
144
244
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..1)", argc);
|
145
245
|
}
|
146
246
|
|
147
|
-
|
247
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
148
248
|
|
149
249
|
MessagePack_Buffer_set_options(b, io, options);
|
150
250
|
|
@@ -153,21 +253,21 @@ static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
|
153
253
|
|
154
254
|
static VALUE Buffer_clear(VALUE self)
|
155
255
|
{
|
156
|
-
|
256
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
157
257
|
msgpack_buffer_clear(b);
|
158
258
|
return Qnil;
|
159
259
|
}
|
160
260
|
|
161
261
|
static VALUE Buffer_size(VALUE self)
|
162
262
|
{
|
163
|
-
|
263
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
164
264
|
size_t size = msgpack_buffer_all_readable_size(b);
|
165
265
|
return SIZET2NUM(size);
|
166
266
|
}
|
167
267
|
|
168
268
|
static VALUE Buffer_empty_p(VALUE self)
|
169
269
|
{
|
170
|
-
|
270
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
171
271
|
if(msgpack_buffer_top_readable_size(b) == 0) {
|
172
272
|
return Qtrue;
|
173
273
|
} else {
|
@@ -177,7 +277,7 @@ static VALUE Buffer_empty_p(VALUE self)
|
|
177
277
|
|
178
278
|
static VALUE Buffer_write(VALUE self, VALUE string_or_buffer)
|
179
279
|
{
|
180
|
-
|
280
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
181
281
|
|
182
282
|
VALUE string = string_or_buffer; // TODO optimize if string_or_buffer is a Buffer
|
183
283
|
StringValue(string);
|
@@ -189,7 +289,7 @@ static VALUE Buffer_write(VALUE self, VALUE string_or_buffer)
|
|
189
289
|
|
190
290
|
static VALUE Buffer_append(VALUE self, VALUE string_or_buffer)
|
191
291
|
{
|
192
|
-
|
292
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
193
293
|
|
194
294
|
VALUE string = string_or_buffer; // TODO optimize if string_or_buffer is a Buffer
|
195
295
|
StringValue(string);
|
@@ -280,14 +380,13 @@ static inline size_t read_until_eof(msgpack_buffer_t* b, VALUE out, unsigned lon
|
|
280
380
|
|
281
381
|
static inline VALUE read_all(msgpack_buffer_t* b, VALUE out)
|
282
382
|
{
|
283
|
-
#ifndef DISABLE_BUFFER_READ_TO_S_OPTIMIZE
|
284
383
|
if(out == Qnil && !msgpack_buffer_has_io(b)) {
|
285
384
|
/* same as to_s && clear; optimize */
|
286
385
|
VALUE str = msgpack_buffer_all_as_string(b);
|
287
386
|
msgpack_buffer_clear(b);
|
288
387
|
return str;
|
289
388
|
}
|
290
|
-
|
389
|
+
|
291
390
|
MAKE_EMPTY_STRING(out);
|
292
391
|
read_until_eof(b, out, 0);
|
293
392
|
return out;
|
@@ -295,7 +394,7 @@ static inline VALUE read_all(msgpack_buffer_t* b, VALUE out)
|
|
295
394
|
|
296
395
|
static VALUE Buffer_skip(VALUE self, VALUE sn)
|
297
396
|
{
|
298
|
-
|
397
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
299
398
|
|
300
399
|
unsigned long n = FIX2ULONG(sn);
|
301
400
|
|
@@ -310,7 +409,7 @@ static VALUE Buffer_skip(VALUE self, VALUE sn)
|
|
310
409
|
|
311
410
|
static VALUE Buffer_skip_all(VALUE self, VALUE sn)
|
312
411
|
{
|
313
|
-
|
412
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
314
413
|
|
315
414
|
unsigned long n = FIX2ULONG(sn);
|
316
415
|
|
@@ -348,7 +447,7 @@ static VALUE Buffer_read_all(int argc, VALUE* argv, VALUE self)
|
|
348
447
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc);
|
349
448
|
}
|
350
449
|
|
351
|
-
|
450
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
352
451
|
|
353
452
|
if(out != Qnil) {
|
354
453
|
CHECK_STRING_TYPE(out);
|
@@ -394,7 +493,7 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
394
493
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc);
|
395
494
|
}
|
396
495
|
|
397
|
-
|
496
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
398
497
|
|
399
498
|
if(out != Qnil) {
|
400
499
|
CHECK_STRING_TYPE(out);
|
@@ -410,7 +509,6 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
410
509
|
return out;
|
411
510
|
}
|
412
511
|
|
413
|
-
#ifndef DISABLE_BUFFER_READ_TO_S_OPTIMIZE
|
414
512
|
if(!msgpack_buffer_has_io(b) && out == Qnil &&
|
415
513
|
msgpack_buffer_all_readable_size(b) <= n) {
|
416
514
|
/* same as to_s && clear; optimize */
|
@@ -423,7 +521,6 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
423
521
|
return str;
|
424
522
|
}
|
425
523
|
}
|
426
|
-
#endif
|
427
524
|
|
428
525
|
MAKE_EMPTY_STRING(out);
|
429
526
|
read_until_eof(b, out, n);
|
@@ -437,32 +534,32 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
437
534
|
|
438
535
|
static VALUE Buffer_to_str(VALUE self)
|
439
536
|
{
|
440
|
-
|
537
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
441
538
|
return msgpack_buffer_all_as_string(b);
|
442
539
|
}
|
443
540
|
|
444
541
|
static VALUE Buffer_to_a(VALUE self)
|
445
542
|
{
|
446
|
-
|
543
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
447
544
|
return msgpack_buffer_all_as_string_array(b);
|
448
545
|
}
|
449
546
|
|
450
547
|
static VALUE Buffer_flush(VALUE self)
|
451
548
|
{
|
452
|
-
|
549
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
453
550
|
msgpack_buffer_flush(b);
|
454
551
|
return self;
|
455
552
|
}
|
456
553
|
|
457
554
|
static VALUE Buffer_io(VALUE self)
|
458
555
|
{
|
459
|
-
|
556
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
460
557
|
return b->io;
|
461
558
|
}
|
462
559
|
|
463
560
|
static VALUE Buffer_close(VALUE self)
|
464
561
|
{
|
465
|
-
|
562
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
466
563
|
if(b->io != Qnil) {
|
467
564
|
return rb_funcall(b->io, s_close, 0);
|
468
565
|
}
|
@@ -471,7 +568,7 @@ static VALUE Buffer_close(VALUE self)
|
|
471
568
|
|
472
569
|
static VALUE Buffer_write_to(VALUE self, VALUE io)
|
473
570
|
{
|
474
|
-
|
571
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
475
572
|
size_t sz = msgpack_buffer_flush_to_io(b, io, s_write, true);
|
476
573
|
return SIZET2NUM(sz);
|
477
574
|
}
|
@@ -483,6 +580,7 @@ void MessagePack_Buffer_module_init(VALUE mMessagePack)
|
|
483
580
|
s_write = rb_intern("write");
|
484
581
|
s_append = rb_intern("<<");
|
485
582
|
s_close = rb_intern("close");
|
583
|
+
s_at_owner = rb_intern("@owner");
|
486
584
|
|
487
585
|
sym_read_reference_threshold = ID2SYM(rb_intern("read_reference_threshold"));
|
488
586
|
sym_write_reference_threshold = ID2SYM(rb_intern("write_reference_threshold"));
|
@@ -490,6 +588,9 @@ void MessagePack_Buffer_module_init(VALUE mMessagePack)
|
|
490
588
|
|
491
589
|
msgpack_buffer_static_init();
|
492
590
|
|
591
|
+
cMessagePack_HeldBuffer = rb_define_class_under(mMessagePack, "HeldBuffer", rb_cBasicObject);
|
592
|
+
rb_undef_alloc_func(cMessagePack_HeldBuffer);
|
593
|
+
|
493
594
|
cMessagePack_Buffer = rb_define_class_under(mMessagePack, "Buffer", rb_cObject);
|
494
595
|
|
495
596
|
rb_define_alloc_func(cMessagePack_Buffer, Buffer_alloc);
|
data/ext/msgpack/buffer_class.h
CHANGED
@@ -25,6 +25,7 @@ extern VALUE cMessagePack_Buffer;
|
|
25
25
|
void MessagePack_Buffer_module_init(VALUE mMessagePack);
|
26
26
|
|
27
27
|
VALUE MessagePack_Buffer_wrap(msgpack_buffer_t* b, VALUE owner);
|
28
|
+
VALUE MessagePack_Buffer_hold(msgpack_buffer_t* b);
|
28
29
|
|
29
30
|
void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options);
|
30
31
|
|
data/ext/msgpack/extconf.rb
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
have_header("ruby/st.h")
|
4
|
-
have_header("st.h")
|
5
3
|
have_func("rb_enc_interned_str", "ruby.h") # Ruby 3.0+
|
6
4
|
have_func("rb_hash_new_capa", "ruby.h") # Ruby 3.2+
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
have_func("rb_proc_call_with_block", "ruby.h") # CRuby (TruffleRuby doesn't have it)
|
6
|
+
have_func("rb_gc_mark_locations", "ruby.h") # Missing on TruffleRuby
|
7
|
+
|
8
|
+
append_cflags([
|
9
|
+
"-fvisibility=hidden",
|
10
|
+
"-I..",
|
11
|
+
"-Wall",
|
12
|
+
"-std=gnu99"
|
13
|
+
])
|
14
|
+
|
15
|
+
if ENV["MSGPACK_DEBUG"]
|
16
|
+
append_cflags(RbConfig::CONFIG["debugflags"]) if RbConfig::CONFIG["debugflags"]
|
17
|
+
append_cflags("-DRUBY_DEBUG=1")
|
10
18
|
end
|
11
|
-
#$CFLAGS << %[ -DDISABLE_RMEM]
|
12
|
-
#$CFLAGS << %[ -DDISABLE_RMEM_REUSE_INTERNAL_FRAGMENT]
|
13
|
-
#$CFLAGS << %[ -DDISABLE_BUFFER_READ_REFERENCE_OPTIMIZE]
|
14
|
-
#$CFLAGS << %[ -DDISABLE_BUFFER_READ_TO_S_OPTIMIZE]
|
15
19
|
|
16
|
-
if RUBY_VERSION.start_with?('3.0.')
|
20
|
+
if RUBY_VERSION.start_with?('3.0.') && RUBY_VERSION <= '3.0.5'
|
17
21
|
# https://bugs.ruby-lang.org/issues/18772
|
18
|
-
|
22
|
+
append_cflags("-DRB_ENC_INTERNED_STR_NULL_CHECK=1")
|
19
23
|
end
|
20
24
|
|
21
25
|
# checking if Hash#[]= (rb_hash_aset) dedupes string keys (Ruby 2.6+)
|
@@ -25,35 +29,21 @@ r = rand.to_s
|
|
25
29
|
h[%W(#{r}).join('')] = :foo
|
26
30
|
x[%W(#{r}).join('')] = :foo
|
27
31
|
if x.keys[0].equal?(h.keys[0])
|
28
|
-
|
32
|
+
append_cflags("-DHASH_ASET_DEDUPE=1")
|
29
33
|
else
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
# checking if String#-@ (str_uminus) dedupes... ' (Ruby 2.5+)
|
35
|
-
begin
|
36
|
-
a = -(%w(t e s t).join)
|
37
|
-
b = -(%w(t e s t).join)
|
38
|
-
if a.equal?(b)
|
39
|
-
$CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 '
|
40
|
-
else
|
41
|
-
$CFLAGS += ' -DSTR_UMINUS_DEDUPE=0 '
|
42
|
-
end
|
43
|
-
rescue NoMethodError
|
44
|
-
$CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
|
34
|
+
append_cflags("-DHASH_ASET_DEDUPE=0")
|
45
35
|
end
|
46
36
|
|
47
37
|
# checking if String#-@ (str_uminus) directly interns frozen strings... ' (Ruby 3.0+)
|
48
38
|
begin
|
49
39
|
s = rand.to_s.freeze
|
50
40
|
if (-s).equal?(s) && (-s.dup).equal?(s)
|
51
|
-
|
41
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=1")
|
52
42
|
else
|
53
|
-
|
43
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
|
54
44
|
end
|
55
45
|
rescue NoMethodError
|
56
|
-
|
46
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
|
57
47
|
end
|
58
48
|
|
59
49
|
if warnflags = CONFIG['warnflags']
|