msgpack 1.5.1 → 1.7.2

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +55 -0
  3. data/README.md +30 -1
  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 +54 -69
  11. data/ext/msgpack/buffer.h +16 -18
  12. data/ext/msgpack/buffer_class.c +138 -37
  13. data/ext/msgpack/buffer_class.h +1 -0
  14. data/ext/msgpack/compat.h +0 -99
  15. data/ext/msgpack/extconf.rb +25 -39
  16. data/ext/msgpack/factory_class.c +75 -86
  17. data/ext/msgpack/packer.c +12 -39
  18. data/ext/msgpack/packer.h +1 -11
  19. data/ext/msgpack/packer_class.c +73 -99
  20. data/ext/msgpack/packer_class.h +11 -0
  21. data/ext/msgpack/packer_ext_registry.c +31 -28
  22. data/ext/msgpack/packer_ext_registry.h +10 -14
  23. data/ext/msgpack/rbinit.c +1 -1
  24. data/ext/msgpack/rmem.c +3 -4
  25. data/ext/msgpack/sysdep.h +5 -2
  26. data/ext/msgpack/unpacker.c +66 -94
  27. data/ext/msgpack/unpacker.h +13 -12
  28. data/ext/msgpack/unpacker_class.c +64 -80
  29. data/ext/msgpack/unpacker_class.h +11 -0
  30. data/ext/msgpack/unpacker_ext_registry.c +4 -16
  31. data/ext/msgpack/unpacker_ext_registry.h +3 -7
  32. data/lib/msgpack/buffer.rb +9 -0
  33. data/lib/msgpack/factory.rb +90 -63
  34. data/lib/msgpack/packer.rb +10 -1
  35. data/lib/msgpack/unpacker.rb +14 -1
  36. data/lib/msgpack/version.rb +1 -1
  37. data/lib/msgpack.rb +1 -0
  38. data/msgpack.gemspec +7 -3
  39. metadata +33 -56
  40. data/.github/workflows/ci.yaml +0 -57
  41. data/.gitignore +0 -23
  42. data/.rubocop.yml +0 -36
  43. data/Gemfile +0 -9
  44. data/Rakefile +0 -70
  45. data/appveyor.yml +0 -18
  46. data/bench/pack.rb +0 -23
  47. data/bench/pack_log.rb +0 -33
  48. data/bench/pack_log_long.rb +0 -65
  49. data/bench/pack_symbols.rb +0 -28
  50. data/bench/run.sh +0 -14
  51. data/bench/run_long.sh +0 -35
  52. data/bench/run_symbols.sh +0 -26
  53. data/bench/unpack.rb +0 -21
  54. data/bench/unpack_log.rb +0 -34
  55. data/bench/unpack_log_long.rb +0 -67
  56. data/doclib/msgpack/buffer.rb +0 -193
  57. data/doclib/msgpack/core_ext.rb +0 -101
  58. data/doclib/msgpack/error.rb +0 -19
  59. data/doclib/msgpack/extension_value.rb +0 -9
  60. data/doclib/msgpack/factory.rb +0 -145
  61. data/doclib/msgpack/packer.rb +0 -209
  62. data/doclib/msgpack/time.rb +0 -22
  63. data/doclib/msgpack/timestamp.rb +0 -44
  64. data/doclib/msgpack/unpacker.rb +0 -183
  65. data/doclib/msgpack.rb +0 -87
  66. data/msgpack.org.md +0 -46
  67. data/spec/bigint_spec.rb +0 -26
  68. data/spec/cases.json +0 -1
  69. data/spec/cases.msg +0 -0
  70. data/spec/cases_compact.msg +0 -0
  71. data/spec/cases_spec.rb +0 -39
  72. data/spec/cruby/buffer_io_spec.rb +0 -255
  73. data/spec/cruby/buffer_packer.rb +0 -29
  74. data/spec/cruby/buffer_spec.rb +0 -575
  75. data/spec/cruby/buffer_unpacker.rb +0 -19
  76. data/spec/cruby/unpacker_spec.rb +0 -70
  77. data/spec/ext_value_spec.rb +0 -99
  78. data/spec/exttypes.rb +0 -51
  79. data/spec/factory_spec.rb +0 -654
  80. data/spec/format_spec.rb +0 -301
  81. data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
  82. data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
  83. data/spec/jruby/unpacker_spec.rb +0 -186
  84. data/spec/msgpack_spec.rb +0 -214
  85. data/spec/pack_spec.rb +0 -61
  86. data/spec/packer_spec.rb +0 -575
  87. data/spec/random_compat.rb +0 -24
  88. data/spec/spec_helper.rb +0 -65
  89. data/spec/timestamp_spec.rb +0 -159
  90. data/spec/unpack_spec.rb +0 -57
  91. data/spec/unpacker_spec.rb +0 -847
@@ -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)
@@ -96,25 +195,26 @@ void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options
96
195
 
97
196
  v = rb_hash_aref(options, sym_read_reference_threshold);
98
197
  if(v != Qnil) {
99
- msgpack_buffer_set_read_reference_threshold(b, NUM2ULONG(v));
198
+ msgpack_buffer_set_read_reference_threshold(b, NUM2SIZET(v));
100
199
  }
101
200
 
102
201
  v = rb_hash_aref(options, sym_write_reference_threshold);
103
202
  if(v != Qnil) {
104
- msgpack_buffer_set_write_reference_threshold(b, NUM2ULONG(v));
203
+ msgpack_buffer_set_write_reference_threshold(b, NUM2SIZET(v));
105
204
  }
106
205
 
107
206
  v = rb_hash_aref(options, sym_io_buffer_size);
108
207
  if(v != Qnil) {
109
- msgpack_buffer_set_io_buffer_size(b, NUM2ULONG(v));
208
+ msgpack_buffer_set_io_buffer_size(b, NUM2SIZET(v));
110
209
  }
111
210
  }
112
211
  }
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,22 +394,22 @@ 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
 
302
401
  /* do nothing */
303
402
  if(n == 0) {
304
- return ULONG2NUM(0);
403
+ return INT2NUM(0);
305
404
  }
306
405
 
307
406
  size_t sz = read_until_eof(b, Qnil, n);
308
- return ULONG2NUM(sz);
407
+ return SIZET2NUM(sz);
309
408
  }
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,9 +568,9 @@ 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
- return ULONG2NUM(sz);
573
+ return SIZET2NUM(sz);
477
574
  }
478
575
 
479
576
  void MessagePack_Buffer_module_init(VALUE mMessagePack)
@@ -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
 
data/ext/msgpack/compat.h CHANGED
@@ -22,104 +22,5 @@
22
22
  #include "ruby.h"
23
23
  #include "ruby/encoding.h"
24
24
 
25
- #if defined(HAVE_RUBY_ST_H)
26
- # include "ruby/st.h" /* ruby hash on Ruby 1.9 */
27
- #elif defined(HAVE_ST_H)
28
- # include "st.h" /* ruby hash on Ruby 1.8 */
29
- #endif
30
-
31
-
32
- /*
33
- * ZALLOC_N (ruby 2.2 or later)
34
- */
35
- #ifndef RB_ZALLOC_N
36
- # define RB_ZALLOC_N(type,n) ((type*)ruby_xcalloc((size_t)(n),sizeof(type)))
37
- #endif
38
- #ifndef ZALLOC_N
39
- # define ZALLOC_N(type,n) RB_ZALLOC_N(type,n)
40
- #endif
41
-
42
-
43
- /*
44
- * define STR_DUP_LIKELY_DOES_COPY
45
- * check rb_str_dup actually copies the string or not
46
- */
47
- #if defined(RUBY_VM) && defined(FL_ALL) && defined(FL_USER1) && defined(FL_USER3) /* MRI 1.9 */
48
- # define STR_DUP_LIKELY_DOES_COPY(str) FL_ALL(str, FL_USER1|FL_USER3) /* same as STR_ASSOC_P(str) */
49
-
50
- #elif defined(FL_TEST) && defined(ELTS_SHARED) /* MRI 1.8 */
51
- # define STR_DUP_LIKELY_DOES_COPY(str) (!FL_TEST(str, ELTS_SHARED))
52
-
53
- //#elif defined(RUBINIUS) || defined(JRUBY) /* Rubinius and JRuby */
54
- #else
55
- # define STR_DUP_LIKELY_DOES_COPY(str) (1)
56
-
57
- #endif
58
-
59
-
60
- /*
61
- * SIZET2NUM
62
- */
63
- #ifndef SIZET2NUM /* MRI 1.8 */
64
- # define SIZET2NUM(v) ULL2NUM(v)
65
- #endif
66
-
67
-
68
- /*
69
- * rb_errinfo()
70
- */
71
- #if defined(RUBY_VM) /* MRI 1.9 */
72
- # define COMPAT_RERAISE rb_exc_raise(rb_errinfo())
73
-
74
- #elif defined(JRUBY) /* JRuby */
75
- # define COMPAT_RERAISE rb_exc_raise(rb_gv_get("$!"))
76
-
77
- #else /* MRI 1.8 and Rubinius */
78
- # define COMPAT_RERAISE rb_exc_raise(ruby_errinfo)
79
- #endif
80
-
81
-
82
- /*
83
- * RBIGNUM_POSITIVE_P
84
- */
85
- #ifndef RBIGNUM_POSITIVE_P
86
- # if defined(RUBINIUS) /* Rubinius <= v1.2.3 */
87
- # define RBIGNUM_POSITIVE_P(b) (rb_funcall(b, rb_intern(">="), 1, INT2FIX(0)) == Qtrue)
88
-
89
- # elif defined(JRUBY) /* JRuby */
90
- # define RBIGNUM_POSITIVE_P(b) (rb_funcall(b, rb_intern(">="), 1, INT2FIX(0)) == Qtrue)
91
- # define rb_big2ull(b) rb_num2ull(b)
92
- /*#define rb_big2ll(b) rb_num2ll(b)*/
93
-
94
- # else /* MRI 1.8 */
95
- # define RBIGNUM_POSITIVE_P(b) (RBIGNUM(b)->sign)
96
- # endif
97
- #endif
98
-
99
-
100
- /*
101
- * RSTRING_PTR, RSTRING_LEN
102
- */
103
- #ifndef RSTRING_PTR /* MRI 1.8.5 */
104
- # define RSTRING_PTR(s) (RSTRING(s)->ptr)
105
- #endif
106
-
107
- #ifndef RSTRING_LEN /* MRI 1.8.5 */
108
- # define RSTRING_LEN(s) (RSTRING(s)->len)
109
- #endif
110
-
111
-
112
- /*
113
- * RSTRUCT_GET
114
- */
115
- #ifndef RSTRUCT_GET
116
- # ifdef RSTRUCT_PTR /* MRI <= 2.0.0 */
117
- # define RSTRUCT_GET(st, idx) (RSTRUCT_PTR(st)[idx])
118
- # else /* Rubinius */
119
- # define RSTRUCT_GET(st, idx) (rb_struct_aref(st, INT2FIX(idx)))
120
- # endif
121
- #endif
122
-
123
-
124
25
  #endif
125
26
 
@@ -1,60 +1,47 @@
1
1
  require 'mkmf'
2
2
 
3
- have_header("ruby/st.h")
4
- have_header("st.h")
5
- have_func("rb_enc_interned_str", "ruby.h")
6
-
7
- unless RUBY_PLATFORM.include? 'mswin'
8
- $CFLAGS << %[ -I.. -Wall -O3 -g -std=gnu99]
9
- end
10
- #$CFLAGS << %[ -DDISABLE_RMEM]
11
- #$CFLAGS << %[ -DDISABLE_RMEM_REUSE_INTERNAL_FRAGMENT]
12
- #$CFLAGS << %[ -DDISABLE_BUFFER_READ_REFERENCE_OPTIMIZE]
13
- #$CFLAGS << %[ -DDISABLE_BUFFER_READ_TO_S_OPTIMIZE]
14
-
15
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
16
- # msgpack-ruby doesn't modify data came from RSTRING_PTR(str)
17
- $CFLAGS << %[ -DRSTRING_NOT_MODIFIED]
18
- # Rubinius C extensions don't grab GVL while rmem is not thread safe
19
- $CFLAGS << %[ -DDISABLE_RMEM]
3
+ have_func("rb_enc_interned_str", "ruby.h") # Ruby 3.0+
4
+ have_func("rb_hash_new_capa", "ruby.h") # Ruby 3.2+
5
+ have_func("rb_proc_call_with_block", "ruby.h") # CRuby (TruffleRuby doesn't have it)
6
+
7
+ append_cflags([
8
+ "-fvisibility=hidden",
9
+ "-I..",
10
+ "-Wall",
11
+ "-O3",
12
+ "-std=gnu99"
13
+ ])
14
+ append_cflags(RbConfig::CONFIG["debugflags"]) if RbConfig::CONFIG["debugflags"]
15
+
16
+ append_cflags("-DRUBY_DEBUG=1") if ENV["MSGPACK_DEBUG"]
17
+
18
+ if RUBY_VERSION.start_with?('3.0.') && RUBY_VERSION <= '3.0.5'
19
+ # https://bugs.ruby-lang.org/issues/18772
20
+ append_cflags("-DRB_ENC_INTERNED_STR_NULL_CHECK=1")
20
21
  end
21
22
 
22
- # checking if Hash#[]= (rb_hash_aset) dedupes string keys
23
+ # checking if Hash#[]= (rb_hash_aset) dedupes string keys (Ruby 2.6+)
23
24
  h = {}
24
25
  x = {}
25
26
  r = rand.to_s
26
27
  h[%W(#{r}).join('')] = :foo
27
28
  x[%W(#{r}).join('')] = :foo
28
29
  if x.keys[0].equal?(h.keys[0])
29
- $CFLAGS << ' -DHASH_ASET_DEDUPE=1 '
30
+ append_cflags("-DHASH_ASET_DEDUPE=1")
30
31
  else
31
- $CFLAGS << ' -DHASH_ASET_DEDUPE=0 '
32
+ append_cflags("-DHASH_ASET_DEDUPE=0")
32
33
  end
33
34
 
34
-
35
- # checking if String#-@ (str_uminus) dedupes... '
36
- begin
37
- a = -(%w(t e s t).join)
38
- b = -(%w(t e s t).join)
39
- if a.equal?(b)
40
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 '
41
- else
42
- $CFLAGS += ' -DSTR_UMINUS_DEDUPE=0 '
43
- end
44
- rescue NoMethodError
45
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
46
- end
47
-
48
- # checking if String#-@ (str_uminus) directly interns frozen strings... '
35
+ # checking if String#-@ (str_uminus) directly interns frozen strings... ' (Ruby 3.0+)
49
36
  begin
50
37
  s = rand.to_s.freeze
51
38
  if (-s).equal?(s) && (-s.dup).equal?(s)
52
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=1 '
39
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=1")
53
40
  else
54
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
41
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
55
42
  end
56
43
  rescue NoMethodError
57
- $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
44
+ append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
58
45
  end
59
46
 
60
47
  if warnflags = CONFIG['warnflags']
@@ -62,4 +49,3 @@ if warnflags = CONFIG['warnflags']
62
49
  end
63
50
 
64
51
  create_makefile('msgpack/msgpack')
65
-