oj 3.11.5 → 3.16.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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +19 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +20 -6
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +10 -9
  9. data/ext/oj/circarray.c +8 -6
  10. data/ext/oj/circarray.h +2 -2
  11. data/ext/oj/code.c +19 -33
  12. data/ext/oj/code.h +2 -2
  13. data/ext/oj/compat.c +27 -77
  14. data/ext/oj/custom.c +86 -179
  15. data/ext/oj/debug.c +126 -0
  16. data/ext/oj/dump.c +256 -249
  17. data/ext/oj/dump.h +26 -12
  18. data/ext/oj/dump_compat.c +565 -642
  19. data/ext/oj/dump_leaf.c +17 -63
  20. data/ext/oj/dump_object.c +65 -187
  21. data/ext/oj/dump_strict.c +27 -51
  22. data/ext/oj/encoder.c +43 -0
  23. data/ext/oj/err.c +2 -13
  24. data/ext/oj/err.h +24 -8
  25. data/ext/oj/extconf.rb +21 -6
  26. data/ext/oj/fast.c +149 -149
  27. data/ext/oj/intern.c +313 -0
  28. data/ext/oj/intern.h +22 -0
  29. data/ext/oj/mem.c +318 -0
  30. data/ext/oj/mem.h +53 -0
  31. data/ext/oj/mimic_json.c +121 -106
  32. data/ext/oj/object.c +85 -162
  33. data/ext/oj/odd.c +89 -67
  34. data/ext/oj/odd.h +15 -15
  35. data/ext/oj/oj.c +542 -411
  36. data/ext/oj/oj.h +99 -73
  37. data/ext/oj/parse.c +175 -187
  38. data/ext/oj/parse.h +26 -24
  39. data/ext/oj/parser.c +1600 -0
  40. data/ext/oj/parser.h +101 -0
  41. data/ext/oj/rails.c +112 -159
  42. data/ext/oj/rails.h +1 -1
  43. data/ext/oj/reader.c +11 -14
  44. data/ext/oj/reader.h +4 -2
  45. data/ext/oj/resolve.c +5 -24
  46. data/ext/oj/rxclass.c +7 -6
  47. data/ext/oj/rxclass.h +1 -1
  48. data/ext/oj/saj.c +22 -33
  49. data/ext/oj/saj2.c +584 -0
  50. data/ext/oj/saj2.h +23 -0
  51. data/ext/oj/scp.c +5 -28
  52. data/ext/oj/sparse.c +28 -72
  53. data/ext/oj/stream_writer.c +50 -40
  54. data/ext/oj/strict.c +56 -61
  55. data/ext/oj/string_writer.c +72 -39
  56. data/ext/oj/trace.h +31 -4
  57. data/ext/oj/usual.c +1218 -0
  58. data/ext/oj/usual.h +69 -0
  59. data/ext/oj/util.h +1 -1
  60. data/ext/oj/val_stack.c +14 -3
  61. data/ext/oj/val_stack.h +8 -7
  62. data/ext/oj/validate.c +46 -0
  63. data/ext/oj/wab.c +63 -88
  64. data/lib/oj/active_support_helper.rb +1 -3
  65. data/lib/oj/bag.rb +7 -1
  66. data/lib/oj/easy_hash.rb +4 -5
  67. data/lib/oj/error.rb +1 -2
  68. data/lib/oj/json.rb +162 -150
  69. data/lib/oj/mimic.rb +9 -7
  70. data/lib/oj/saj.rb +20 -6
  71. data/lib/oj/schandler.rb +5 -4
  72. data/lib/oj/state.rb +12 -8
  73. data/lib/oj/version.rb +1 -2
  74. data/lib/oj.rb +2 -0
  75. data/pages/Compatibility.md +1 -1
  76. data/pages/InstallOptions.md +20 -0
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +8 -3
  79. data/pages/Options.md +43 -5
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +14 -2
  82. data/test/_test_active.rb +8 -9
  83. data/test/_test_active_mimic.rb +7 -8
  84. data/test/_test_mimic_rails.rb +17 -20
  85. data/test/activerecord/result_test.rb +5 -6
  86. data/test/activesupport6/encoding_test.rb +63 -28
  87. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  88. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  89. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  90. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  91. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  92. data/test/files.rb +15 -15
  93. data/test/foo.rb +16 -45
  94. data/test/helper.rb +11 -8
  95. data/test/isolated/shared.rb +3 -2
  96. data/test/json_gem/json_addition_test.rb +2 -2
  97. data/test/json_gem/json_common_interface_test.rb +8 -6
  98. data/test/json_gem/json_encoding_test.rb +0 -0
  99. data/test/json_gem/json_ext_parser_test.rb +1 -0
  100. data/test/json_gem/json_fixtures_test.rb +3 -2
  101. data/test/json_gem/json_generator_test.rb +56 -38
  102. data/test/json_gem/json_generic_object_test.rb +11 -11
  103. data/test/json_gem/json_parser_test.rb +54 -47
  104. data/test/json_gem/json_string_matching_test.rb +9 -9
  105. data/test/json_gem/test_helper.rb +7 -3
  106. data/test/mem.rb +34 -0
  107. data/test/perf.rb +22 -27
  108. data/test/perf_compat.rb +31 -33
  109. data/test/perf_dump.rb +50 -0
  110. data/test/perf_fast.rb +80 -82
  111. data/test/perf_file.rb +27 -29
  112. data/test/perf_object.rb +65 -69
  113. data/test/perf_once.rb +59 -0
  114. data/test/perf_parser.rb +183 -0
  115. data/test/perf_saj.rb +46 -54
  116. data/test/perf_scp.rb +58 -69
  117. data/test/perf_simple.rb +41 -39
  118. data/test/perf_strict.rb +74 -82
  119. data/test/perf_wab.rb +67 -69
  120. data/test/prec.rb +5 -5
  121. data/test/sample/change.rb +0 -1
  122. data/test/sample/dir.rb +0 -1
  123. data/test/sample/doc.rb +0 -1
  124. data/test/sample/file.rb +0 -1
  125. data/test/sample/group.rb +0 -1
  126. data/test/sample/hasprops.rb +0 -1
  127. data/test/sample/layer.rb +0 -1
  128. data/test/sample/rect.rb +0 -1
  129. data/test/sample/shape.rb +0 -1
  130. data/test/sample/text.rb +0 -1
  131. data/test/sample.rb +16 -16
  132. data/test/sample_json.rb +8 -8
  133. data/test/test_compat.rb +95 -43
  134. data/test/test_custom.rb +73 -51
  135. data/test/test_debian.rb +7 -10
  136. data/test/test_fast.rb +135 -79
  137. data/test/test_file.rb +41 -30
  138. data/test/test_gc.rb +16 -5
  139. data/test/test_generate.rb +5 -5
  140. data/test/test_hash.rb +5 -5
  141. data/test/test_integer_range.rb +9 -9
  142. data/test/test_null.rb +20 -20
  143. data/test/test_object.rb +99 -96
  144. data/test/test_parser.rb +11 -0
  145. data/test/test_parser_debug.rb +27 -0
  146. data/test/test_parser_saj.rb +337 -0
  147. data/test/test_parser_usual.rb +251 -0
  148. data/test/test_rails.rb +2 -2
  149. data/test/test_saj.rb +10 -8
  150. data/test/test_scp.rb +37 -39
  151. data/test/test_strict.rb +40 -32
  152. data/test/test_various.rb +165 -84
  153. data/test/test_wab.rb +48 -44
  154. data/test/test_writer.rb +47 -47
  155. data/test/tests.rb +13 -5
  156. data/test/tests_mimic.rb +12 -3
  157. data/test/tests_mimic_addition.rb +12 -3
  158. metadata +74 -128
  159. data/ext/oj/hash.c +0 -131
  160. data/ext/oj/hash.h +0 -19
  161. data/ext/oj/hash_test.c +0 -491
  162. data/test/activesupport4/decoding_test.rb +0 -108
  163. data/test/activesupport4/encoding_test.rb +0 -531
  164. data/test/activesupport4/test_helper.rb +0 -41
  165. data/test/activesupport5/test_helper.rb +0 -72
  166. data/test/bar.rb +0 -35
  167. data/test/baz.rb +0 -16
  168. data/test/zoo.rb +0 -13
data/ext/oj/mimic_json.c CHANGED
@@ -3,11 +3,10 @@
3
3
 
4
4
  #include "dump.h"
5
5
  #include "encode.h"
6
+ #include "mem.h"
6
7
  #include "oj.h"
7
8
  #include "parse.h"
8
9
 
9
- static VALUE symbolize_names_sym = Qundef;
10
-
11
10
  extern const char oj_json_class[];
12
11
 
13
12
  VALUE oj_array_nl_sym;
@@ -200,7 +199,6 @@ static int mimic_limit_arg(VALUE a) {
200
199
  * Returns [_String_] a JSON string.
201
200
  */
202
201
  static VALUE mimic_dump(int argc, VALUE *argv, VALUE self) {
203
- char buf[4096];
204
202
  struct _out out;
205
203
  struct _options copts = oj_default_options;
206
204
  VALUE rstr;
@@ -208,10 +206,9 @@ static VALUE mimic_dump(int argc, VALUE *argv, VALUE self) {
208
206
 
209
207
  copts.str_rx.head = NULL;
210
208
  copts.str_rx.tail = NULL;
211
- out.buf = buf;
212
- out.end = buf + sizeof(buf) - 10;
213
- out.allocated = false;
214
- out.caller = CALLER_DUMP;
209
+
210
+ oj_out_init(&out);
211
+
215
212
  copts.escape_mode = JXEsc;
216
213
  copts.mode = CompatMode;
217
214
 
@@ -259,9 +256,9 @@ static VALUE mimic_dump(int argc, VALUE *argv, VALUE self) {
259
256
  rb_funcall2(io, oj_write_id, 1, args);
260
257
  rstr = io;
261
258
  }
262
- if (out.allocated) {
263
- xfree(out.buf);
264
- }
259
+
260
+ oj_out_free(&out);
261
+
265
262
  return rstr;
266
263
  }
267
264
 
@@ -274,7 +271,7 @@ static int mimic_walk(VALUE key, VALUE obj, VALUE proc) {
274
271
  size_t i;
275
272
 
276
273
  for (i = 0; i < cnt; i++) {
277
- mimic_walk(Qnil, rb_ary_entry(obj, i), proc);
274
+ mimic_walk(Qnil, RARRAY_AREF(obj, i), proc);
278
275
  }
279
276
  break;
280
277
  }
@@ -351,26 +348,25 @@ static VALUE mimic_load(int argc, VALUE *argv, VALUE self) {
351
348
  static VALUE mimic_dump_load(int argc, VALUE *argv, VALUE self) {
352
349
  if (1 > argc) {
353
350
  rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
354
- } else if (T_STRING == rb_type(*argv)) {
351
+ }
352
+ if (T_STRING == rb_type(*argv)) {
355
353
  return mimic_load(argc, argv, self);
356
- } else {
357
- return mimic_dump(argc, argv, self);
358
354
  }
359
- return Qnil;
355
+ return mimic_dump(argc, argv, self);
360
356
  }
361
357
 
362
358
  static VALUE mimic_generate_core(int argc, VALUE *argv, Options copts) {
363
- char buf[4096];
364
359
  struct _out out;
365
360
  VALUE rstr;
366
361
 
367
- memset(buf, 0, sizeof(buf));
362
+ if (0 == argc) {
363
+ rb_raise(rb_eArgError, "wrong number of arguments (0))");
364
+ }
365
+ memset(out.stack_buffer, 0, sizeof(out.stack_buffer));
366
+
367
+ oj_out_init(&out);
368
368
 
369
- out.buf = buf;
370
- out.end = buf + sizeof(buf) - 10;
371
- out.allocated = false;
372
- out.omit_nil = copts->dump_opts.omit_nil;
373
- out.caller = CALLER_GENERATE;
369
+ out.omit_nil = copts->dump_opts.omit_nil;
374
370
  // For obj.to_json or generate nan is not allowed but if called from dump
375
371
  // it is.
376
372
  copts->dump_opts.nan_dump = RaiseNan;
@@ -389,9 +385,11 @@ static VALUE mimic_generate_core(int argc, VALUE *argv, Options copts) {
389
385
  } else {
390
386
  VALUE active_hack[1];
391
387
 
392
- if (Qundef == state_class) {
393
- oj_define_mimic_json(0, NULL, Qnil);
394
- }
388
+ if (Qundef == state_class) {
389
+ rb_warn("Oj::Rails.mimic_JSON was called implicitly. "
390
+ "Call it explicitly beforehand if you want to remove this warning.");
391
+ oj_define_mimic_json(0, NULL, Qnil);
392
+ }
395
393
  active_hack[0] = rb_funcall(state_class, oj_new_id, 0);
396
394
  oj_dump_obj_to_json_using_params(*argv, copts, &out, 1, active_hack);
397
395
  }
@@ -400,9 +398,9 @@ static VALUE mimic_generate_core(int argc, VALUE *argv, Options copts) {
400
398
  }
401
399
  rstr = rb_str_new2(out.buf);
402
400
  rstr = oj_encode(rstr);
403
- if (out.allocated) {
404
- xfree(out.buf);
405
- }
401
+
402
+ oj_out_free(&out);
403
+
406
404
  return rstr;
407
405
  }
408
406
 
@@ -427,7 +425,7 @@ static VALUE mimic_generate_core(int argc, VALUE *argv, Options copts) {
427
425
  * - *:object_nl* [_String_] String placed after a JSON object
428
426
  * - *:array_nl* [_String_] String placed after a JSON array
429
427
  * - *:ascii_only* [_Boolean_] if not nil or false then use only ascii characters in the output.
430
- * Note JSON.generate does support this even if it is not documented.
428
+ * Note JSON.generate does support this even if it is not documented.
431
429
  *
432
430
  * Returns [_String_] generated JSON.
433
431
  */
@@ -459,28 +457,33 @@ oj_mimic_pretty_generate(int argc, VALUE *argv, VALUE self) {
459
457
  // a Hash. I haven't dug deep enough to find out why but using a State
460
458
  // instance and not a Hash gives the desired behavior.
461
459
  *rargs = *argv;
462
- if (1 == argc) {
460
+ if (0 == argc) {
461
+ rb_raise(rb_eArgError, "wrong number of arguments (0))");
462
+ }
463
+ if (1 == argc || Qnil == argv[1]) {
463
464
  h = rb_hash_new();
464
465
  } else {
465
466
  h = argv[1];
466
467
  }
467
- if (Qfalse == rb_funcall(h, oj_has_key_id, 1, oj_indent_sym)) {
468
+ if (!oj_hash_has_key(h, oj_indent_sym)) {
468
469
  rb_hash_aset(h, oj_indent_sym, rb_str_new2(" "));
469
470
  }
470
- if (Qfalse == rb_funcall(h, oj_has_key_id, 1, oj_space_before_sym)) {
471
+ if (!oj_hash_has_key(h, oj_space_before_sym)) {
471
472
  rb_hash_aset(h, oj_space_before_sym, rb_str_new2(""));
472
473
  }
473
- if (Qfalse == rb_funcall(h, oj_has_key_id, 1, oj_space_sym)) {
474
+ if (!oj_hash_has_key(h, oj_space_sym)) {
474
475
  rb_hash_aset(h, oj_space_sym, rb_str_new2(" "));
475
476
  }
476
- if (Qfalse == rb_funcall(h, oj_has_key_id, 1, oj_object_nl_sym)) {
477
+ if (!oj_hash_has_key(h, oj_object_nl_sym)) {
477
478
  rb_hash_aset(h, oj_object_nl_sym, rb_str_new2("\n"));
478
479
  }
479
- if (Qfalse == rb_funcall(h, oj_has_key_id, 1, oj_array_nl_sym)) {
480
+ if (!oj_hash_has_key(h, oj_array_nl_sym)) {
480
481
  rb_hash_aset(h, oj_array_nl_sym, rb_str_new2("\n"));
481
482
  }
482
483
  if (Qundef == state_class) {
483
- oj_define_mimic_json(0, NULL, Qnil);
484
+ rb_warn("Oj::Rails.mimic_JSON was called implicitly. "
485
+ "Call it explicitly beforehand if you want to remove this warning.");
486
+ oj_define_mimic_json(0, NULL, Qnil);
484
487
  }
485
488
  rargs[1] = rb_funcall(state_class, oj_new_id, 1, h);
486
489
 
@@ -501,6 +504,44 @@ oj_mimic_pretty_generate(int argc, VALUE *argv, VALUE self) {
501
504
  return mimic_generate_core(2, rargs, &copts);
502
505
  }
503
506
 
507
+ static int parse_options_cb(VALUE k, VALUE v, VALUE info) {
508
+ struct _parseInfo *pi = (struct _parseInfo *)info;
509
+
510
+ if (oj_symbolize_names_sym == k) {
511
+ pi->options.sym_key = (Qtrue == v) ? Yes : No;
512
+ } else if (oj_quirks_mode_sym == k) {
513
+ pi->options.quirks_mode = (Qtrue == v) ? Yes : No;
514
+ } else if (oj_create_additions_sym == k) {
515
+ pi->options.create_ok = (Qtrue == v) ? Yes : No;
516
+ } else if (oj_allow_nan_sym == k) {
517
+ pi->options.allow_nan = (Qtrue == v) ? Yes : No;
518
+ } else if (oj_hash_class_sym == k) {
519
+ if (Qnil == v) {
520
+ pi->options.hash_class = Qnil;
521
+ } else {
522
+ rb_check_type(v, T_CLASS);
523
+ pi->options.hash_class = v;
524
+ }
525
+ } else if (oj_object_class_sym == k) {
526
+ if (Qnil == v) {
527
+ pi->options.hash_class = Qnil;
528
+ } else {
529
+ rb_check_type(v, T_CLASS);
530
+ pi->options.hash_class = v;
531
+ }
532
+ } else if (oj_array_class_sym == k) {
533
+ if (Qnil == v) {
534
+ pi->options.array_class = Qnil;
535
+ } else {
536
+ rb_check_type(v, T_CLASS);
537
+ pi->options.array_class = v;
538
+ }
539
+ } else if (oj_decimal_class_sym == k) {
540
+ pi->options.compat_bigdec = (oj_bigdecimal_class == v);
541
+ }
542
+ return ST_CONTINUE;
543
+ }
544
+
504
545
  static VALUE mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
505
546
  struct _parseInfo pi;
506
547
  VALUE ropts;
@@ -516,7 +557,7 @@ static VALUE mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
516
557
  pi.options = oj_default_options;
517
558
  pi.options.auto_define = No;
518
559
  pi.options.quirks_mode = Yes;
519
- pi.options.allow_invalid = No;
560
+ pi.options.allow_invalid = Yes;
520
561
  pi.options.empty_string = No;
521
562
  pi.options.create_ok = No;
522
563
  pi.options.allow_nan = (bang ? Yes : No);
@@ -531,51 +572,7 @@ static VALUE mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
531
572
  if (T_HASH != rb_type(ropts)) {
532
573
  rb_raise(rb_eArgError, "options must be a hash.");
533
574
  }
534
- if (Qundef == symbolize_names_sym) {
535
- symbolize_names_sym = ID2SYM(rb_intern("symbolize_names"));
536
- rb_gc_register_address(&symbolize_names_sym);
537
- }
538
- if (Qnil != (v = rb_hash_lookup(ropts, symbolize_names_sym))) {
539
- pi.options.sym_key = (Qtrue == v) ? Yes : No;
540
- }
541
- if (Qnil != (v = rb_hash_lookup(ropts, oj_quirks_mode_sym))) {
542
- pi.options.quirks_mode = (Qtrue == v) ? Yes : No;
543
- }
544
- if (Qnil != (v = rb_hash_lookup(ropts, oj_create_additions_sym))) {
545
- pi.options.create_ok = (Qtrue == v) ? Yes : No;
546
- }
547
- if (Qnil != (v = rb_hash_lookup(ropts, oj_allow_nan_sym))) {
548
- pi.options.allow_nan = (Qtrue == v) ? Yes : No;
549
- }
550
-
551
- if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_hash_class_sym)) {
552
- if (Qnil == (v = rb_hash_lookup(ropts, oj_hash_class_sym))) {
553
- pi.options.hash_class = Qnil;
554
- } else {
555
- rb_check_type(v, T_CLASS);
556
- pi.options.hash_class = v;
557
- }
558
- }
559
- if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_object_class_sym)) {
560
- if (Qnil == (v = rb_hash_lookup(ropts, oj_object_class_sym))) {
561
- pi.options.hash_class = Qnil;
562
- } else {
563
- rb_check_type(v, T_CLASS);
564
- pi.options.hash_class = v;
565
- }
566
- }
567
- if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_array_class_sym)) {
568
- if (Qnil == (v = rb_hash_lookup(ropts, oj_array_class_sym))) {
569
- pi.options.array_class = Qnil;
570
- } else {
571
- rb_check_type(v, T_CLASS);
572
- pi.options.array_class = v;
573
- }
574
- }
575
- if (Qtrue == rb_funcall(ropts, oj_has_key_id, 1, oj_decimal_class_sym)) {
576
- pi.options.compat_bigdec = (oj_bigdecimal_class ==
577
- rb_hash_lookup(ropts, oj_decimal_class_sym));
578
- }
575
+ rb_hash_foreach(ropts, parse_options_cb, (VALUE)&pi);
579
576
  v = rb_hash_lookup(ropts, oj_max_nesting_sym);
580
577
  if (Qtrue == v) {
581
578
  pi.max_depth = 100;
@@ -608,9 +605,9 @@ static VALUE mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
608
605
  * - *source* [_String_|IO] source to parse
609
606
  * - *opts* [_Hash_] options
610
607
  * - *:symbolize* [Boolean] _names flag indicating JSON object keys should be Symbols instead of
611
- * Strings
608
+ * Strings
612
609
  * - *:create_additions* [Boolean] flag indicating a key matching +create_id+ in a JSON object
613
- * should trigger the creation of Ruby Object
610
+ * should trigger the creation of Ruby Object
614
611
  *
615
612
  * Returns [Object]
616
613
  * @see create_id=
@@ -653,23 +650,22 @@ static VALUE mimic_recurse_proc(VALUE self, VALUE obj) {
653
650
  *
654
651
  * - *id* [_nil_|String] new create_id
655
652
  *
656
- * Returns [_String_] the id.
653
+ * Returns [_nil_|_String_] the id.
657
654
  */
658
655
  static VALUE mimic_set_create_id(VALUE self, VALUE id) {
659
- Check_Type(id, T_STRING);
660
-
661
656
  if (NULL != oj_default_options.create_id) {
662
657
  if (oj_json_class != oj_default_options.create_id) {
663
- xfree((char *)oj_default_options.create_id);
658
+ OJ_R_FREE((char *)oj_default_options.create_id);
664
659
  }
665
660
  oj_default_options.create_id = NULL;
666
661
  oj_default_options.create_id_len = 0;
667
662
  }
668
663
  if (Qnil != id) {
669
- size_t len = RSTRING_LEN(id) + 1;
664
+ const char *ptr = StringValueCStr(id);
665
+ size_t len = RSTRING_LEN(id) + 1;
670
666
 
671
- oj_default_options.create_id = ALLOC_N(char, len);
672
- strcpy((char *)oj_default_options.create_id, StringValuePtr(id));
667
+ oj_default_options.create_id = OJ_R_ALLOC_N(char, len);
668
+ strcpy((char *)oj_default_options.create_id, ptr);
673
669
  oj_default_options.create_id_len = len - 1;
674
670
  }
675
671
  return id;
@@ -682,7 +678,7 @@ static VALUE mimic_set_create_id(VALUE self, VALUE id) {
682
678
  */
683
679
  static VALUE mimic_create_id(VALUE self) {
684
680
  if (NULL != oj_default_options.create_id) {
685
- return oj_encode(rb_str_new_cstr(oj_default_options.create_id));
681
+ return rb_utf8_str_new(oj_default_options.create_id, oj_default_options.create_id_len);
686
682
  }
687
683
  return rb_str_new_cstr(oj_json_class);
688
684
  }
@@ -706,13 +702,15 @@ static struct _options mimic_object_to_json_options = {0, // indent
706
702
  No, // empty_string
707
703
  Yes, // allow_gc
708
704
  Yes, // quirks_mode
709
- No, // allow_invalid
705
+ Yes, // allow_invalid
710
706
  No, // create_ok
711
707
  No, // allow_nan
712
708
  No, // trace
713
709
  No, // safe
714
710
  false, // sec_prec_set
715
711
  No, // ignore_under
712
+ Yes, // cache_keys
713
+ 0, // cache_str
716
714
  0, // int_range_min
717
715
  0, // int_range_max
718
716
  oj_json_class, // create_id
@@ -737,6 +735,7 @@ static struct _options mimic_object_to_json_options = {0, // indent
737
735
  0, // array_size
738
736
  RaiseNan, // nan_dump
739
737
  false, // omit_nil
738
+ false, // omit_null_byte
740
739
  100, // max_depth
741
740
  },
742
741
  {
@@ -747,19 +746,18 @@ static struct _options mimic_object_to_json_options = {0, // indent
747
746
  }};
748
747
 
749
748
  static VALUE mimic_object_to_json(int argc, VALUE *argv, VALUE self) {
750
- char buf[4096];
751
749
  struct _out out;
752
750
  VALUE rstr;
753
751
  struct _options copts = oj_default_options;
754
752
 
755
753
  copts.str_rx.head = NULL;
756
754
  copts.str_rx.tail = NULL;
757
- out.buf = buf;
758
- out.end = buf + sizeof(buf) - 10;
759
- out.allocated = false;
760
- out.omit_nil = copts.dump_opts.omit_nil;
761
- copts.mode = CompatMode;
762
- copts.to_json = No;
755
+
756
+ oj_out_init(&out);
757
+
758
+ out.omit_nil = copts.dump_opts.omit_nil;
759
+ copts.mode = CompatMode;
760
+ copts.to_json = No;
763
761
  if (1 <= argc && Qnil != argv[0]) {
764
762
  oj_parse_mimic_dump_options(argv[0], &copts);
765
763
  }
@@ -772,9 +770,9 @@ static VALUE mimic_object_to_json(int argc, VALUE *argv, VALUE self) {
772
770
  }
773
771
  rstr = rb_str_new2(out.buf);
774
772
  rstr = oj_encode(rstr);
775
- if (out.allocated) {
776
- xfree(out.buf);
777
- }
773
+
774
+ oj_out_free(&out);
775
+
778
776
  return rstr;
779
777
  }
780
778
 
@@ -791,28 +789,48 @@ void oj_mimic_json_methods(VALUE json) {
791
789
  VALUE json_error;
792
790
  VALUE generator;
793
791
  VALUE ext;
792
+ VALUE verbose;
793
+
794
+ // rb_undef_method doesn't work for modules or maybe sometimes
795
+ // doesn't. Anyway setting verbose should hide the warning.
796
+ verbose = rb_gv_get("$VERBOSE");
797
+ rb_gv_set("$VERBOSE", Qfalse);
794
798
 
799
+ rb_undef_method(json, "create_id=");
795
800
  rb_define_module_function(json, "create_id=", mimic_set_create_id, 1);
801
+ rb_undef_method(json, "create_id");
796
802
  rb_define_module_function(json, "create_id", mimic_create_id, 0);
797
803
 
804
+ rb_undef_method(json, "dump");
798
805
  rb_define_module_function(json, "dump", mimic_dump, -1);
806
+ rb_undef_method(json, "load");
799
807
  rb_define_module_function(json, "load", mimic_load, -1);
800
808
  rb_define_module_function(json, "restore", mimic_load, -1);
809
+ rb_undef_method(json, "recurse_proc");
801
810
  rb_define_module_function(json, "recurse_proc", mimic_recurse_proc, 1);
811
+ rb_undef_method(json, "[]");
802
812
  rb_define_module_function(json, "[]", mimic_dump_load, -1);
803
813
 
814
+ rb_undef_method(json, "generate");
804
815
  rb_define_module_function(json, "generate", oj_mimic_generate, -1);
816
+ rb_undef_method(json, "fast_generate");
805
817
  rb_define_module_function(json, "fast_generate", oj_mimic_generate, -1);
818
+ rb_undef_method(json, "pretty_generate");
806
819
  rb_define_module_function(json, "pretty_generate", oj_mimic_pretty_generate, -1);
807
820
  // For older versions of JSON, the deprecated unparse methods.
821
+ rb_undef_method(json, "unparse");
808
822
  rb_define_module_function(json, "unparse", oj_mimic_generate, -1);
809
823
  rb_define_module_function(json, "fast_unparse", oj_mimic_generate, -1);
810
824
  rb_define_module_function(json, "pretty_unparse", oj_mimic_pretty_generate, -1);
811
825
 
826
+ rb_undef_method(json, "parse");
812
827
  rb_define_module_function(json, "parse", oj_mimic_parse, -1);
828
+ rb_undef_method(json, "parse!");
813
829
  rb_define_module_function(json, "parse!", mimic_parse_bang, -1);
814
830
 
831
+ rb_undef_method(json, "state");
815
832
  rb_define_module_function(json, "state", mimic_state, 0);
833
+ rb_gv_set("$VERBOSE", verbose);
816
834
 
817
835
  if (rb_const_defined_at(json, rb_intern("JSONError"))) {
818
836
  json_error = rb_const_get(json, rb_intern("JSONError"));
@@ -851,9 +869,6 @@ void oj_mimic_json_methods(VALUE json) {
851
869
  // Pull in the JSON::State mimic file.
852
870
  state_class = rb_const_get_at(generator, rb_intern("State"));
853
871
  rb_gc_register_mark_object(state_class);
854
-
855
- symbolize_names_sym = ID2SYM(rb_intern("symbolize_names"));
856
- rb_gc_register_address(&symbolize_names_sym);
857
872
  }
858
873
 
859
874
  /* Document-module: JSON