oj 2.17.4 → 2.17.5

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