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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +50 -0
  3. data/README.md +48 -12
  4. data/ext/java/org/msgpack/jruby/Buffer.java +3 -3
  5. data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +11 -20
  6. data/ext/java/org/msgpack/jruby/ExtensionValue.java +1 -1
  7. data/ext/java/org/msgpack/jruby/Factory.java +11 -50
  8. data/ext/java/org/msgpack/jruby/Packer.java +9 -24
  9. data/ext/java/org/msgpack/jruby/Unpacker.java +15 -32
  10. data/ext/msgpack/buffer.c +69 -56
  11. data/ext/msgpack/buffer.h +138 -44
  12. data/ext/msgpack/buffer_class.c +132 -31
  13. data/ext/msgpack/buffer_class.h +1 -0
  14. data/ext/msgpack/extconf.rb +20 -30
  15. data/ext/msgpack/factory_class.c +75 -86
  16. data/ext/msgpack/packer.c +13 -16
  17. data/ext/msgpack/packer.h +24 -21
  18. data/ext/msgpack/packer_class.c +72 -98
  19. data/ext/msgpack/packer_class.h +11 -0
  20. data/ext/msgpack/packer_ext_registry.c +31 -28
  21. data/ext/msgpack/packer_ext_registry.h +10 -14
  22. data/ext/msgpack/rbinit.c +1 -1
  23. data/ext/msgpack/rmem.c +3 -4
  24. data/ext/msgpack/sysdep.h +5 -2
  25. data/ext/msgpack/unpacker.c +201 -113
  26. data/ext/msgpack/unpacker.h +22 -15
  27. data/ext/msgpack/unpacker_class.c +87 -92
  28. data/ext/msgpack/unpacker_class.h +11 -0
  29. data/ext/msgpack/unpacker_ext_registry.c +4 -16
  30. data/ext/msgpack/unpacker_ext_registry.h +3 -7
  31. data/lib/msgpack/buffer.rb +9 -0
  32. data/lib/msgpack/factory.rb +90 -63
  33. data/lib/msgpack/packer.rb +10 -1
  34. data/lib/msgpack/unpacker.rb +14 -1
  35. data/lib/msgpack/version.rb +1 -1
  36. data/lib/msgpack.rb +1 -0
  37. data/msgpack.gemspec +8 -3
  38. metadata +21 -51
  39. data/.github/workflows/ci.yaml +0 -57
  40. data/.gitignore +0 -23
  41. data/.rubocop.yml +0 -36
  42. data/Gemfile +0 -9
  43. data/Rakefile +0 -70
  44. data/appveyor.yml +0 -18
  45. data/bench/bench.rb +0 -78
  46. data/doclib/msgpack/buffer.rb +0 -193
  47. data/doclib/msgpack/core_ext.rb +0 -101
  48. data/doclib/msgpack/error.rb +0 -19
  49. data/doclib/msgpack/extension_value.rb +0 -9
  50. data/doclib/msgpack/factory.rb +0 -145
  51. data/doclib/msgpack/packer.rb +0 -209
  52. data/doclib/msgpack/time.rb +0 -22
  53. data/doclib/msgpack/timestamp.rb +0 -44
  54. data/doclib/msgpack/unpacker.rb +0 -183
  55. data/doclib/msgpack.rb +0 -87
  56. data/msgpack.org.md +0 -46
  57. data/spec/bigint_spec.rb +0 -26
  58. data/spec/cases.json +0 -1
  59. data/spec/cases.msg +0 -0
  60. data/spec/cases_compact.msg +0 -0
  61. data/spec/cases_spec.rb +0 -39
  62. data/spec/cruby/buffer_io_spec.rb +0 -255
  63. data/spec/cruby/buffer_packer.rb +0 -29
  64. data/spec/cruby/buffer_spec.rb +0 -575
  65. data/spec/cruby/buffer_unpacker.rb +0 -19
  66. data/spec/cruby/unpacker_spec.rb +0 -70
  67. data/spec/ext_value_spec.rb +0 -99
  68. data/spec/exttypes.rb +0 -51
  69. data/spec/factory_spec.rb +0 -688
  70. data/spec/format_spec.rb +0 -301
  71. data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
  72. data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
  73. data/spec/jruby/unpacker_spec.rb +0 -186
  74. data/spec/msgpack_spec.rb +0 -214
  75. data/spec/pack_spec.rb +0 -61
  76. data/spec/packer_spec.rb +0 -575
  77. data/spec/random_compat.rb +0 -24
  78. data/spec/spec_helper.rb +0 -71
  79. data/spec/timestamp_spec.rb +0 -159
  80. data/spec/unpack_spec.rb +0 -57
  81. data/spec/unpacker_spec.rb +0 -859
@@ -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
- #define BUFFER(from, name) \
38
- msgpack_buffer_t *name = NULL; \
39
- Data_Get_Struct(from, msgpack_buffer_t, name); \
40
- if(name == NULL) { \
41
- rb_raise(rb_eArgError, "NULL found for " # name " when shouldn't be."); \
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 = ZALLOC_N(msgpack_buffer_t, 1);
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 Data_Wrap_Struct(klass, msgpack_buffer_mark, Buffer_free, b);
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
- b->owner = owner;
117
- return Data_Wrap_Struct(cMessagePack_Buffer, msgpack_buffer_mark, NULL, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- #endif
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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
- BUFFER(self, b);
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);
@@ -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
 
@@ -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
- unless RUBY_PLATFORM.include? 'mswin'
9
- $CFLAGS << %[ -I.. -Wall -O3 #{RbConfig::CONFIG["debugflags"]} -std=gnu99]
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
- $CFLAGS << ' -DRB_ENC_INTERNED_STR_NULL_CHECK=1 '
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
- $CFLAGS << ' -DHASH_ASET_DEDUPE=1 '
32
+ append_cflags("-DHASH_ASET_DEDUPE=1")
29
33
  else
30
- $CFLAGS << ' -DHASH_ASET_DEDUPE=0 '
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
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=1 '
41
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=1")
52
42
  else
53
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
43
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
54
44
  end
55
45
  rescue NoMethodError
56
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
46
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
57
47
  end
58
48
 
59
49
  if warnflags = CONFIG['warnflags']