oj 3.11.5 → 3.16.5

Sign up to get free protection for your applications and to get access to all the features.
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