oj 2.17.4 → 2.17.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f9904f1f35cca59ff6e3e9f9f3a2e391cdc29404
4
+ data.tar.gz: 77f647f9b93058861cbe1f2fe84e1063169fc5b1
5
+ SHA512:
6
+ metadata.gz: eb5d9a18cc205da2c52035750f274ea4c9a41fbe71b383eff0e032c4006c37c87c8b3a3fb238239e4e4e4f8ee9920007666fe3daa9de1b001e2cc118d1ebcf22
7
+ data.tar.gz: 8e414158909fcdf69bb16fc1465b6d710ec36f1845849f716c021629162873026d6fa38cf19330e92a65911804df69eaea6e982b84b7b153853e0e09df303651
data/README.md CHANGED
@@ -170,10 +170,9 @@ Oj.default_options = {:mode => :compat }
170
170
 
171
171
  ## Releases
172
172
 
173
- **Release 2.17.4**
173
+ **Future Release 2.17.5**
174
174
 
175
- - Added the ascii_only option to JSON.generate when in mimic_JSON mode so that
176
- it is consistent with the undocumented feature in the json gem.
175
+ - Added additional code to check for as_json arguments and recursive calls.
177
176
 
178
177
  [Older release notes](http://www.ohler.com/dev/oj_misc/release_notes.html).
179
178
 
@@ -59,7 +59,7 @@
59
59
  typedef unsigned long ulong;
60
60
 
61
61
  static void raise_strict(VALUE obj);
62
- static void dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv);
62
+ static void dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok);
63
63
  static void dump_nil(Out out);
64
64
  static void dump_true(Out out);
65
65
  static void dump_false(Out out);
@@ -85,11 +85,11 @@ static void dump_ruby_time(VALUE obj, Out out);
85
85
  static void dump_xml_time(VALUE obj, Out out);
86
86
  static void dump_data_strict(VALUE obj, Out out);
87
87
  static void dump_data_null(VALUE obj, Out out);
88
- static void dump_data_comp(VALUE obj, int depth, Out out);
88
+ static void dump_data_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok);
89
89
  static void dump_data_obj(VALUE obj, int depth, Out out);
90
- static void dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv);
90
+ static void dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok);
91
91
  static void dump_obj_obj(VALUE obj, int depth, Out out);
92
- static void dump_struct_comp(VALUE obj, int depth, Out out);
92
+ static void dump_struct_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok);
93
93
  static void dump_struct_obj(VALUE obj, int depth, Out out);
94
94
  #if HAS_IVAR_HELPERS
95
95
  static int dump_attr_cb(ID key, VALUE value, Out out);
@@ -795,7 +795,7 @@ dump_array(VALUE a, VALUE clas, int depth, Out out) {
795
795
  } else {
796
796
  fill_indent(out, d2);
797
797
  }
798
- dump_val(rb_ary_entry(a, i), d2, out, 0, 0);
798
+ dump_val(rb_ary_entry(a, i), d2, out, 0, 0, true);
799
799
  if (i < cnt) {
800
800
  *out->cur++ = ',';
801
801
  }
@@ -876,7 +876,7 @@ hash_cb_strict(VALUE key, VALUE value, Out out) {
876
876
  out->cur += out->opts->dump_opts.after_size;
877
877
  }
878
878
  }
879
- dump_val(value, depth, out, 0, 0);
879
+ dump_val(value, depth, out, 0, 0, false);
880
880
  out->depth = depth;
881
881
  *out->cur++ = ',';
882
882
 
@@ -943,7 +943,7 @@ hash_cb_compat(VALUE key, VALUE value, Out out) {
943
943
  out->cur += out->opts->dump_opts.after_size;
944
944
  }
945
945
  }
946
- dump_val(value, depth, out, 0, 0);
946
+ dump_val(value, depth, out, 0, 0, true);
947
947
  out->depth = depth;
948
948
  *out->cur++ = ',';
949
949
 
@@ -965,11 +965,11 @@ hash_cb_object(VALUE key, VALUE value, Out out) {
965
965
  if (rb_type(key) == T_STRING) {
966
966
  dump_str_obj(key, Qundef, depth, out);
967
967
  *out->cur++ = ':';
968
- dump_val(value, depth, out, 0, 0);
968
+ dump_val(value, depth, out, 0, 0, true);
969
969
  } else if (rb_type(key) == T_SYMBOL) {
970
970
  dump_sym_obj(key, out);
971
971
  *out->cur++ = ':';
972
- dump_val(value, depth, out, 0, 0);
972
+ dump_val(value, depth, out, 0, 0, true);
973
973
  } else {
974
974
  int d2 = depth + 1;
975
975
  long s2 = size + out->indent + 1;
@@ -997,13 +997,13 @@ hash_cb_object(VALUE key, VALUE value, Out out) {
997
997
  *out->cur++ = ':';
998
998
  *out->cur++ = '[';
999
999
  fill_indent(out, d2);
1000
- dump_val(key, d2, out, 0, 0);
1000
+ dump_val(key, d2, out, 0, 0, true);
1001
1001
  if (out->end - out->cur <= (long)s2) {
1002
1002
  grow(out, s2);
1003
1003
  }
1004
1004
  *out->cur++ = ',';
1005
1005
  fill_indent(out, d2);
1006
- dump_val(value, d2, out, 0, 0);
1006
+ dump_val(value, d2, out, 0, 0, true);
1007
1007
  if (out->end - out->cur <= (long)size) {
1008
1008
  grow(out, size);
1009
1009
  }
@@ -1318,10 +1318,10 @@ dump_data_null(VALUE obj, Out out) {
1318
1318
  }
1319
1319
 
1320
1320
  static void
1321
- dump_data_comp(VALUE obj, int depth, Out out) {
1321
+ dump_data_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1322
1322
  VALUE clas = rb_obj_class(obj);
1323
1323
 
1324
- if (rb_respond_to(obj, oj_to_hash_id)) {
1324
+ if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1325
1325
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1326
1326
 
1327
1327
  if (T_HASH != rb_type(h)) {
@@ -1330,7 +1330,7 @@ dump_data_comp(VALUE obj, int depth, Out out) {
1330
1330
  // will be dumped.
1331
1331
 
1332
1332
  //rb_raise(rb_eTypeError, "%s.to_hash() did not return a Hash.\n", rb_class2name(rb_obj_class(obj)));
1333
- dump_val(h, depth, out, 0, 0);
1333
+ dump_val(h, depth, out, 0, 0, false);
1334
1334
  }
1335
1335
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1336
1336
 
@@ -1338,16 +1338,36 @@ dump_data_comp(VALUE obj, int depth, Out out) {
1338
1338
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1339
1339
 
1340
1340
  dump_raw(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), out);
1341
- } else if (rb_respond_to(obj, oj_as_json_id)) {
1342
- volatile VALUE aj = rb_funcall(obj, oj_as_json_id, 0);
1341
+ } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1342
+ volatile VALUE aj;
1343
+
1344
+ // Some classes elect to not take an options argument so check the arity
1345
+ // of as_json.
1346
+ switch (rb_obj_method_arity(obj, oj_as_json_id)) {
1347
+ case 0:
1348
+ aj = rb_funcall2(obj, oj_as_json_id, 0, 0);
1349
+ break;
1350
+ case 1:
1351
+ if (1 <= argc) {
1352
+ aj = rb_funcall2(obj, oj_as_json_id, 1, argv);
1353
+ } else {
1354
+ VALUE nothing [1];
1343
1355
 
1356
+ nothing[0] = Qnil;
1357
+ aj = rb_funcall2(obj, oj_as_json_id, 1, nothing);
1358
+ }
1359
+ break;
1360
+ default:
1361
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1362
+ break;
1363
+ }
1344
1364
  // Catch the obvious brain damaged recursive dumping.
1345
1365
  if (aj == obj) {
1346
1366
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1347
1367
 
1348
1368
  dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
1349
1369
  } else {
1350
- dump_val(aj, depth, out, 0, 0);
1370
+ dump_val(aj, depth, out, 0, 0, false);
1351
1371
  }
1352
1372
  } else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
1353
1373
  volatile VALUE rs;
@@ -1430,8 +1450,8 @@ dump_data_obj(VALUE obj, int depth, Out out) {
1430
1450
  }
1431
1451
 
1432
1452
  static void
1433
- dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
1434
- if (rb_respond_to(obj, oj_to_hash_id)) {
1453
+ dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1454
+ if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1435
1455
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1436
1456
 
1437
1457
  if (T_HASH != rb_type(h)) {
@@ -1440,20 +1460,40 @@ dump_obj_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
1440
1460
  // will be dumped.
1441
1461
 
1442
1462
  //rb_raise(rb_eTypeError, "%s.to_hash() did not return a Hash.\n", rb_class2name(rb_obj_class(obj)));
1443
- dump_val(h, depth, out, 0, 0);
1463
+ dump_val(h, depth, out, 0, 0, false);
1444
1464
  } else {
1445
1465
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1446
1466
  }
1447
- } else if (rb_respond_to(obj, oj_as_json_id)) {
1448
- volatile VALUE aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1467
+ } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1468
+ volatile VALUE aj;
1449
1469
 
1470
+ // Some classes elect to not take an options argument so check the arity
1471
+ // of as_json.
1472
+ switch (rb_obj_method_arity(obj, oj_as_json_id)) {
1473
+ case 0:
1474
+ aj = rb_funcall2(obj, oj_as_json_id, 0, 0);
1475
+ break;
1476
+ case 1:
1477
+ if (1 <= argc) {
1478
+ aj = rb_funcall2(obj, oj_as_json_id, 1, argv);
1479
+ } else {
1480
+ VALUE nothing [1];
1481
+
1482
+ nothing[0] = Qnil;
1483
+ aj = rb_funcall2(obj, oj_as_json_id, 1, nothing);
1484
+ }
1485
+ break;
1486
+ default:
1487
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1488
+ break;
1489
+ }
1450
1490
  // Catch the obvious brain damaged recursive dumping.
1451
1491
  if (aj == obj) {
1452
1492
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1453
1493
 
1454
1494
  dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
1455
1495
  } else {
1456
- dump_val(aj, depth, out, 0, 0);
1496
+ dump_val(aj, depth, out, 0, 0, false);
1457
1497
  }
1458
1498
  } else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
1459
1499
  volatile VALUE rs;
@@ -1567,7 +1607,7 @@ dump_attr_cb(ID key, VALUE value, Out out) {
1567
1607
  dump_cstr(buf, strlen(buf), 0, 0, out);
1568
1608
  }
1569
1609
  *out->cur++ = ':';
1570
- dump_val(value, depth, out, 0, 0);
1610
+ dump_val(value, depth, out, 0, 0, true);
1571
1611
  out->depth = depth;
1572
1612
  *out->cur++ = ',';
1573
1613
 
@@ -1727,7 +1767,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1727
1767
  dump_cstr(buf, strlen(attr) + 1, 0, 0, out);
1728
1768
  }
1729
1769
  *out->cur++ = ':';
1730
- dump_val(value, d2, out, 0, 0);
1770
+ dump_val(value, d2, out, 0, 0, true);
1731
1771
  if (out->end - out->cur <= 2) {
1732
1772
  grow(out, 2);
1733
1773
  }
@@ -1748,7 +1788,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1748
1788
  dump_cstr("~mesg", 5, 0, 0, out);
1749
1789
  *out->cur++ = ':';
1750
1790
  rv = rb_funcall2(obj, rb_intern("message"), 0, 0);
1751
- dump_val(rv, d2, out, 0, 0);
1791
+ dump_val(rv, d2, out, 0, 0, true);
1752
1792
  if (out->end - out->cur <= 2) {
1753
1793
  grow(out, 2);
1754
1794
  }
@@ -1761,7 +1801,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1761
1801
  dump_cstr("~bt", 3, 0, 0, out);
1762
1802
  *out->cur++ = ':';
1763
1803
  rv = rb_funcall2(obj, rb_intern("backtrace"), 0, 0);
1764
- dump_val(rv, d2, out, 0, 0);
1804
+ dump_val(rv, d2, out, 0, 0, true);
1765
1805
  if (out->end - out->cur <= 2) {
1766
1806
  grow(out, 2);
1767
1807
  }
@@ -1775,8 +1815,8 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
1775
1815
  }
1776
1816
 
1777
1817
  static void
1778
- dump_struct_comp(VALUE obj, int depth, Out out) {
1779
- if (rb_respond_to(obj, oj_to_hash_id)) {
1818
+ dump_struct_comp(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
1819
+ if (as_ok && rb_respond_to(obj, oj_to_hash_id)) {
1780
1820
  volatile VALUE h = rb_funcall(obj, oj_to_hash_id, 0);
1781
1821
 
1782
1822
  if (T_HASH != rb_type(h)) {
@@ -1785,19 +1825,39 @@ dump_struct_comp(VALUE obj, int depth, Out out) {
1785
1825
  // will be dumped.
1786
1826
 
1787
1827
  //rb_raise(rb_eTypeError, "%s.to_hash() did not return a Hash.\n", rb_class2name(rb_obj_class(obj)));
1788
- dump_val(h, depth, out, 0, 0);
1828
+ dump_val(h, depth, out, 0, 0, false);
1789
1829
  }
1790
1830
  dump_hash(h, Qundef, depth, out->opts->mode, out);
1791
- } else if (rb_respond_to(obj, oj_as_json_id)) {
1792
- volatile VALUE aj = rb_funcall(obj, oj_as_json_id, 0);
1831
+ } else if (as_ok && rb_respond_to(obj, oj_as_json_id)) {
1832
+ volatile VALUE aj;
1833
+
1834
+ // Some classes elect to not take an options argument so check the arity
1835
+ // of as_json.
1836
+ switch (rb_obj_method_arity(obj, oj_as_json_id)) {
1837
+ case 0:
1838
+ aj = rb_funcall2(obj, oj_as_json_id, 0, 0);
1839
+ break;
1840
+ case 1:
1841
+ if (1 <= argc) {
1842
+ aj = rb_funcall2(obj, oj_as_json_id, 1, argv);
1843
+ } else {
1844
+ VALUE nothing [1];
1793
1845
 
1846
+ nothing[0] = Qnil;
1847
+ aj = rb_funcall2(obj, oj_as_json_id, 1, nothing);
1848
+ }
1849
+ break;
1850
+ default:
1851
+ aj = rb_funcall2(obj, oj_as_json_id, argc, argv);
1852
+ break;
1853
+ }
1794
1854
  // Catch the obvious brain damaged recursive dumping.
1795
1855
  if (aj == obj) {
1796
1856
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1797
1857
 
1798
1858
  dump_cstr(rb_string_value_ptr((VALUE*)&rstr), RSTRING_LEN(rstr), 0, 0, out);
1799
1859
  } else {
1800
- dump_val(aj, depth, out, 0, 0);
1860
+ dump_val(aj, depth, out, 0, 0, false);
1801
1861
  }
1802
1862
  } else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
1803
1863
  volatile VALUE rs = rb_funcall(obj, oj_to_json_id, 0);
@@ -1882,7 +1942,7 @@ dump_struct_obj(VALUE obj, int depth, Out out) {
1882
1942
  grow(out, size);
1883
1943
  }
1884
1944
  fill_indent(out, d3);
1885
- dump_val(*vp, d3, out, 0, 0);
1945
+ dump_val(*vp, d3, out, 0, 0, true);
1886
1946
  *out->cur++ = ',';
1887
1947
  }
1888
1948
  }
@@ -2005,7 +2065,7 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
2005
2065
  fill_indent(out, d2);
2006
2066
  dump_cstr(name, nlen, 0, 0, out);
2007
2067
  *out->cur++ = ':';
2008
- dump_val(v, d2, out, 0, 0);
2068
+ dump_val(v, d2, out, 0, 0, true);
2009
2069
  if (out->end - out->cur <= 2) {
2010
2070
  grow(out, 2);
2011
2071
  }
@@ -2023,7 +2083,7 @@ raise_strict(VALUE obj) {
2023
2083
  }
2024
2084
 
2025
2085
  static void
2026
- dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
2086
+ dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv, bool as_ok) {
2027
2087
  int type = rb_type(obj);
2028
2088
 
2029
2089
  if (MAX_DEPTH < depth) {
@@ -2061,7 +2121,7 @@ dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
2061
2121
  switch (out->opts->mode) {
2062
2122
  case StrictMode: raise_strict(obj); break;
2063
2123
  case NullMode: dump_nil(out); break;
2064
- case CompatMode: dump_struct_comp(obj, depth, out); break;
2124
+ case CompatMode: dump_struct_comp(obj, depth, out, argc, argv, as_ok); break;
2065
2125
  case ObjectMode:
2066
2126
  default: dump_struct_obj(obj, depth, out); break;
2067
2127
  }
@@ -2098,7 +2158,7 @@ dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
2098
2158
  switch (out->opts->mode) {
2099
2159
  case StrictMode: dump_data_strict(obj, out); break;
2100
2160
  case NullMode: dump_data_null(obj, out); break;
2101
- case CompatMode: dump_obj_comp(obj, depth, out, argc, argv); break;
2161
+ case CompatMode: dump_obj_comp(obj, depth, out, argc, argv, as_ok); break;
2102
2162
  case ObjectMode:
2103
2163
  default: dump_obj_obj(obj, depth, out); break;
2104
2164
  }
@@ -2107,7 +2167,7 @@ dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
2107
2167
  switch (out->opts->mode) {
2108
2168
  case StrictMode: dump_data_strict(obj, out); break;
2109
2169
  case NullMode: dump_data_null(obj, out); break;
2110
- case CompatMode: dump_data_comp(obj, depth, out);break;
2170
+ case CompatMode: dump_data_comp(obj, depth, out, argc, argv, as_ok);break;
2111
2171
  case ObjectMode:
2112
2172
  default: dump_data_obj(obj, depth, out); break;
2113
2173
  }
@@ -2121,7 +2181,7 @@ dump_val(VALUE obj, int depth, Out out, int argc, VALUE *argv) {
2121
2181
  case NullMode: dump_nil(out); break;
2122
2182
  case CompatMode:
2123
2183
  case ObjectMode:
2124
- default: dump_obj_comp(obj, depth, out, argc, argv); break;
2184
+ default: dump_obj_comp(obj, depth, out, argc, argv, as_ok); break;
2125
2185
  }
2126
2186
  break;
2127
2187
  default:
@@ -2165,7 +2225,7 @@ oj_dump_obj_to_json_using_params(VALUE obj, Options copts, Out out, int argc, VA
2165
2225
  oj_cache8_new(&out->circ_cache);
2166
2226
  }
2167
2227
  out->indent = copts->indent;
2168
- dump_val(obj, 0, out, argc, argv);
2228
+ dump_val(obj, 0, out, argc, argv, true);
2169
2229
  if (0 < out->indent) {
2170
2230
  switch (*(out->cur - 1)) {
2171
2231
  case ']':
@@ -2615,7 +2675,7 @@ oj_str_writer_push_value(StrWriter sw, VALUE val, const char *key) {
2615
2675
  *sw->out.cur++ = ':';
2616
2676
  }
2617
2677
  }
2618
- dump_val(val, sw->depth, &sw->out, 0, 0);
2678
+ dump_val(val, sw->depth, &sw->out, 0, 0, true);
2619
2679
  }
2620
2680
 
2621
2681
  void
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Oj
3
3
  # Current version of the module.
4
- VERSION = '2.17.4'
4
+ VERSION = '2.17.5'
5
5
  end
@@ -5,60 +5,47 @@ $: << File.dirname(__FILE__)
5
5
 
6
6
  require 'helper'
7
7
 
8
- require 'oj'
9
- require 'securerandom'
10
-
11
8
  class Handler
12
- def hash_start() {} end
13
- def hash_set(h,k,v) h.store(k,v) end
14
- def array_start() [] end
15
- def array_append(a,v) a << v end
16
- def error(message, line, column)
17
- raise Exception.new(message, line, column)
9
+ def initialize
10
+ @state = []
18
11
  end
19
- end
20
12
 
21
- json = Oj.dump({"this"=>"object"})
13
+ def hash_start
14
+ @state << {}
15
+ @state.last
16
+ end
17
+
18
+ def hash_end
19
+ @state.pop
20
+ end
22
21
 
23
- if true
24
- name = "/tmp/#{SecureRandom.uuid}"
25
- `mkfifo #{name}`
26
- if fork
27
- open(name, 'r+') do |read_io|
28
- p "start reading #{read_io.stat.ftype}"
29
- Oj.sc_parse(Handler.new, read_io) {|v| p v}
30
- p "stop reading"
31
- end
32
- else
33
- open(name, 'w+') do |write_io|
34
- p "start writing #{write_io.stat.ftype} autoclose: #{write_io.autoclose?}"
35
- write_io.write json
36
- write_io.write json
37
- p "stop writing"
38
- end
39
- sleep(1) # make it obvious that there are two threads
40
- open(name, 'w+') do |write_io|
41
- p "start writing #{write_io.stat.ftype}"
42
- write_io.write json
43
- write_io.write json
44
- p "stop writing"
45
- end
22
+ def hash_set(h,k,v)
23
+ h.store(k,v)
46
24
  end
47
- else
48
- IO.pipe do |read_io, write_io|
49
- if fork
50
- write_io.close
51
- p "start reading #{read_io.stat.ftype}"
52
- Oj.sc_parse(Handler.new, read_io) {|v| p v}
53
- p "stop reading"
54
- read_io.close
55
- else
56
- read_io.close
57
- p "start writing #{write_io.stat.ftype}"
58
- write_io.write json
59
- write_io.write json
60
- p "stop writing"
61
- write_io.close
62
- end
25
+
26
+ def array_start
27
+ @state << []
28
+ @state.last
29
+ end
30
+
31
+
32
+ def array_end
33
+ @state.pop
63
34
  end
35
+
36
+ def array_append(a,v)
37
+ a << v
38
+ end
39
+
40
+ def add_value(v)
41
+ p v
42
+ end
43
+
44
+ def error(message, line, column); p "ERROR: #{message}" end
64
45
  end
46
+
47
+ $handler = Handler.new
48
+
49
+ IO.popen("cat tst") { |p| puts Oj.sc_parse($handler, p) }
50
+
51
+ #File.open('tst', 'r') { |file| Oj.sc_parse($handler, file) }