oj 3.13.23 → 3.16.10

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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -0
  3. data/README.md +2 -2
  4. data/ext/oj/buf.h +7 -6
  5. data/ext/oj/cache.c +29 -26
  6. data/ext/oj/cache.h +3 -2
  7. data/ext/oj/cache8.c +10 -9
  8. data/ext/oj/circarray.c +7 -5
  9. data/ext/oj/circarray.h +2 -2
  10. data/ext/oj/code.c +5 -12
  11. data/ext/oj/code.h +2 -2
  12. data/ext/oj/compat.c +20 -60
  13. data/ext/oj/custom.c +26 -59
  14. data/ext/oj/debug.c +3 -9
  15. data/ext/oj/dump.c +103 -53
  16. data/ext/oj/dump.h +1 -4
  17. data/ext/oj/dump_compat.c +557 -592
  18. data/ext/oj/dump_leaf.c +3 -5
  19. data/ext/oj/dump_object.c +42 -48
  20. data/ext/oj/dump_strict.c +10 -22
  21. data/ext/oj/encoder.c +1 -1
  22. data/ext/oj/err.c +2 -13
  23. data/ext/oj/err.h +9 -12
  24. data/ext/oj/extconf.rb +16 -7
  25. data/ext/oj/fast.c +63 -98
  26. data/ext/oj/intern.c +62 -47
  27. data/ext/oj/intern.h +3 -7
  28. data/ext/oj/mem.c +318 -0
  29. data/ext/oj/mem.h +53 -0
  30. data/ext/oj/mimic_json.c +54 -38
  31. data/ext/oj/object.c +33 -43
  32. data/ext/oj/odd.c +8 -6
  33. data/ext/oj/odd.h +4 -4
  34. data/ext/oj/oj.c +245 -216
  35. data/ext/oj/oj.h +83 -81
  36. data/ext/oj/parse.c +109 -153
  37. data/ext/oj/parse.h +21 -24
  38. data/ext/oj/parser.c +80 -67
  39. data/ext/oj/parser.h +9 -8
  40. data/ext/oj/rails.c +71 -94
  41. data/ext/oj/reader.c +9 -14
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +13 -15
  47. data/ext/oj/saj2.c +37 -49
  48. data/ext/oj/saj2.h +1 -1
  49. data/ext/oj/scp.c +6 -20
  50. data/ext/oj/sparse.c +22 -70
  51. data/ext/oj/stream_writer.c +46 -48
  52. data/ext/oj/strict.c +22 -56
  53. data/ext/oj/string_writer.c +64 -40
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +125 -114
  56. data/ext/oj/usual.h +7 -6
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +13 -2
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/wab.c +25 -57
  61. data/lib/oj/active_support_helper.rb +1 -3
  62. data/lib/oj/bag.rb +7 -1
  63. data/lib/oj/easy_hash.rb +4 -5
  64. data/lib/oj/error.rb +0 -1
  65. data/lib/oj/json.rb +162 -150
  66. data/lib/oj/mimic.rb +7 -7
  67. data/lib/oj/schandler.rb +5 -4
  68. data/lib/oj/state.rb +8 -5
  69. data/lib/oj/version.rb +1 -2
  70. data/lib/oj.rb +2 -0
  71. data/pages/InstallOptions.md +20 -0
  72. data/pages/Options.md +4 -0
  73. metadata +46 -121
  74. data/test/_test_active.rb +0 -76
  75. data/test/_test_active_mimic.rb +0 -96
  76. data/test/_test_mimic_rails.rb +0 -126
  77. data/test/activerecord/result_test.rb +0 -32
  78. data/test/activesupport4/decoding_test.rb +0 -108
  79. data/test/activesupport4/encoding_test.rb +0 -531
  80. data/test/activesupport4/test_helper.rb +0 -41
  81. data/test/activesupport5/abstract_unit.rb +0 -45
  82. data/test/activesupport5/decoding_test.rb +0 -133
  83. data/test/activesupport5/encoding_test.rb +0 -500
  84. data/test/activesupport5/encoding_test_cases.rb +0 -98
  85. data/test/activesupport5/test_helper.rb +0 -72
  86. data/test/activesupport5/time_zone_test_helpers.rb +0 -39
  87. data/test/activesupport6/abstract_unit.rb +0 -44
  88. data/test/activesupport6/decoding_test.rb +0 -133
  89. data/test/activesupport6/encoding_test.rb +0 -507
  90. data/test/activesupport6/encoding_test_cases.rb +0 -98
  91. data/test/activesupport6/test_common.rb +0 -17
  92. data/test/activesupport6/test_helper.rb +0 -163
  93. data/test/activesupport6/time_zone_test_helpers.rb +0 -39
  94. data/test/activesupport7/abstract_unit.rb +0 -49
  95. data/test/activesupport7/decoding_test.rb +0 -125
  96. data/test/activesupport7/encoding_test.rb +0 -486
  97. data/test/activesupport7/encoding_test_cases.rb +0 -104
  98. data/test/activesupport7/time_zone_test_helpers.rb +0 -47
  99. data/test/bar.rb +0 -11
  100. data/test/baz.rb +0 -16
  101. data/test/bug.rb +0 -16
  102. data/test/files.rb +0 -29
  103. data/test/foo.rb +0 -77
  104. data/test/helper.rb +0 -42
  105. data/test/isolated/shared.rb +0 -308
  106. data/test/isolated/test_mimic_after.rb +0 -13
  107. data/test/isolated/test_mimic_alone.rb +0 -12
  108. data/test/isolated/test_mimic_as_json.rb +0 -45
  109. data/test/isolated/test_mimic_before.rb +0 -13
  110. data/test/isolated/test_mimic_define.rb +0 -28
  111. data/test/isolated/test_mimic_rails_after.rb +0 -22
  112. data/test/isolated/test_mimic_rails_before.rb +0 -21
  113. data/test/isolated/test_mimic_redefine.rb +0 -15
  114. data/test/json_gem/json_addition_test.rb +0 -216
  115. data/test/json_gem/json_common_interface_test.rb +0 -153
  116. data/test/json_gem/json_encoding_test.rb +0 -107
  117. data/test/json_gem/json_ext_parser_test.rb +0 -20
  118. data/test/json_gem/json_fixtures_test.rb +0 -35
  119. data/test/json_gem/json_generator_test.rb +0 -396
  120. data/test/json_gem/json_generic_object_test.rb +0 -90
  121. data/test/json_gem/json_parser_test.rb +0 -477
  122. data/test/json_gem/json_string_matching_test.rb +0 -42
  123. data/test/json_gem/test_helper.rb +0 -30
  124. data/test/mem.rb +0 -33
  125. data/test/perf.rb +0 -107
  126. data/test/perf_compat.rb +0 -130
  127. data/test/perf_dump.rb +0 -50
  128. data/test/perf_fast.rb +0 -164
  129. data/test/perf_file.rb +0 -64
  130. data/test/perf_object.rb +0 -138
  131. data/test/perf_once.rb +0 -58
  132. data/test/perf_parser.rb +0 -189
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -152
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -139
  137. data/test/perf_wab.rb +0 -131
  138. data/test/prec.rb +0 -23
  139. data/test/sample/change.rb +0 -14
  140. data/test/sample/dir.rb +0 -19
  141. data/test/sample/doc.rb +0 -36
  142. data/test/sample/file.rb +0 -48
  143. data/test/sample/group.rb +0 -16
  144. data/test/sample/hasprops.rb +0 -16
  145. data/test/sample/layer.rb +0 -12
  146. data/test/sample/line.rb +0 -20
  147. data/test/sample/oval.rb +0 -10
  148. data/test/sample/rect.rb +0 -10
  149. data/test/sample/shape.rb +0 -35
  150. data/test/sample/text.rb +0 -20
  151. data/test/sample.rb +0 -54
  152. data/test/sample_json.rb +0 -37
  153. data/test/test_compat.rb +0 -540
  154. data/test/test_custom.rb +0 -544
  155. data/test/test_debian.rb +0 -53
  156. data/test/test_fast.rb +0 -530
  157. data/test/test_file.rb +0 -255
  158. data/test/test_gc.rb +0 -60
  159. data/test/test_generate.rb +0 -21
  160. data/test/test_hash.rb +0 -39
  161. data/test/test_integer_range.rb +0 -72
  162. data/test/test_null.rb +0 -376
  163. data/test/test_object.rb +0 -1025
  164. data/test/test_parser.rb +0 -11
  165. data/test/test_parser_debug.rb +0 -27
  166. data/test/test_parser_saj.rb +0 -335
  167. data/test/test_parser_usual.rb +0 -217
  168. data/test/test_rails.rb +0 -35
  169. data/test/test_saj.rb +0 -186
  170. data/test/test_scp.rb +0 -431
  171. data/test/test_strict.rb +0 -435
  172. data/test/test_various.rb +0 -752
  173. data/test/test_wab.rb +0 -309
  174. data/test/test_writer.rb +0 -380
  175. data/test/tests.rb +0 -33
  176. data/test/tests_mimic.rb +0 -23
  177. data/test/tests_mimic_addition.rb +0 -16
  178. data/test/zoo.rb +0 -13
data/ext/oj/parser.c CHANGED
@@ -20,7 +20,7 @@
20
20
  #define FRAC_LIMIT 10000000000000000ULL
21
21
 
22
22
  // Give better performance with indented JSON but worse with unindented.
23
- //#define SPACE_JUMP
23
+ // #define SPACE_JUMP
24
24
 
25
25
  enum {
26
26
  SKIP_CHAR = 'a',
@@ -1114,9 +1114,6 @@ static void parse(ojParser p, const byte *json) {
1114
1114
  p->map = trail_map;
1115
1115
  }
1116
1116
  }
1117
- if (0 < p->depth) {
1118
- parse_error(p, "parse error, not closed");
1119
- }
1120
1117
  if (0 == p->depth) {
1121
1118
  switch (p->map[256]) {
1122
1119
  case '0':
@@ -1148,7 +1145,7 @@ static void parser_free(void *ptr) {
1148
1145
  if (NULL != p->free) {
1149
1146
  p->free(p);
1150
1147
  }
1151
- xfree(ptr);
1148
+ OJ_R_FREE(ptr);
1152
1149
  }
1153
1150
 
1154
1151
  static void parser_mark(void *ptr) {
@@ -1164,6 +1161,17 @@ static void parser_mark(void *ptr) {
1164
1161
  }
1165
1162
  }
1166
1163
 
1164
+ const rb_data_type_t oj_parser_type = {
1165
+ "Oj/parser",
1166
+ {
1167
+ parser_mark,
1168
+ parser_free,
1169
+ NULL,
1170
+ },
1171
+ 0,
1172
+ 0,
1173
+ };
1174
+
1167
1175
  extern void oj_set_parser_validator(ojParser p);
1168
1176
  extern void oj_set_parser_saj(ojParser p);
1169
1177
  extern void oj_set_parser_usual(ojParser p);
@@ -1180,7 +1188,7 @@ static int opt_cb(VALUE rkey, VALUE value, VALUE ptr) {
1180
1188
  rkey = rb_sym2str(rkey);
1181
1189
  // fall through
1182
1190
  case RUBY_T_STRING:
1183
- key = rb_string_value_ptr(&rkey);
1191
+ key = StringValuePtr(rkey);
1184
1192
  klen = RSTRING_LEN(rkey);
1185
1193
  break;
1186
1194
  default: rb_raise(rb_eArgError, "option keys must be a symbol or string");
@@ -1205,7 +1213,7 @@ static int opt_cb(VALUE rkey, VALUE value, VALUE ptr) {
1205
1213
  * Oj::Parser.new(:usual, cache_keys: true).
1206
1214
  */
1207
1215
  static VALUE parser_new(int argc, VALUE *argv, VALUE self) {
1208
- ojParser p = ALLOC(struct _ojParser);
1216
+ ojParser p = OJ_R_ALLOC(struct _ojParser);
1209
1217
 
1210
1218
  #if HAVE_RB_EXT_RACTOR_SAFE
1211
1219
  // This doesn't seem to do anything.
@@ -1255,7 +1263,7 @@ static VALUE parser_new(int argc, VALUE *argv, VALUE self) {
1255
1263
  rb_hash_foreach(ropts, opt_cb, (VALUE)p);
1256
1264
  }
1257
1265
  }
1258
- return Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1266
+ return TypedData_Wrap_Struct(parser_class, &oj_parser_type, p);
1259
1267
  }
1260
1268
 
1261
1269
  // Create a new parser without setting the delegate. The parser is
@@ -1263,8 +1271,8 @@ static VALUE parser_new(int argc, VALUE *argv, VALUE self) {
1263
1271
  // from this function. A delegate must be added before the parser can be
1264
1272
  // used. Optionally oj_parser_set_options can be called if the options are not
1265
1273
  // set directly.
1266
- VALUE oj_parser_new() {
1267
- ojParser p = ALLOC(struct _ojParser);
1274
+ VALUE oj_parser_new(void) {
1275
+ ojParser p = OJ_R_ALLOC(struct _ojParser);
1268
1276
 
1269
1277
  #if HAVE_RB_EXT_RACTOR_SAFE
1270
1278
  // This doesn't seem to do anything.
@@ -1275,7 +1283,7 @@ VALUE oj_parser_new() {
1275
1283
  buf_init(&p->buf);
1276
1284
  p->map = value_map;
1277
1285
 
1278
- return Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1286
+ return TypedData_Wrap_Struct(parser_class, &oj_parser_type, p);
1279
1287
  }
1280
1288
 
1281
1289
  // Set set the options from a hash (ropts).
@@ -1294,53 +1302,41 @@ void oj_parser_set_option(ojParser p, VALUE ropts) {
1294
1302
  * - no options
1295
1303
  *
1296
1304
  * - *:saj*
1297
- * - _cache_keys=_ sets the value of the _cache_keys_ flag.
1298
- * - _cache_keys_ returns the value of the _cache_keys_ flag.
1299
- * - _cache_strings=_ sets the value of the _cache_strings_ to an positive integer less than 35. Strings shorter than
1300
- * that length are cached.
1301
- * - _cache_strings_ returns the value of the _cache_strings_ integer value.
1302
- * - _handler=_ sets the SAJ handler
1303
- * - _handler_ returns the SAJ handler
1305
+ * - _cache_keys_ is a flag indicating hash keys should be cached.
1306
+ * - _cache_strings_ is a positive integer less than 35. Strings shorter than that length are cached.
1307
+ * - _handler_ is the SAJ handler
1304
1308
  *
1305
1309
  * - *:usual*
1306
- * - _cache_keys=_ sets the value of the _cache_keys_ flag.
1307
- * - _cache_keys_ returns the value of the _cache_keys_ flag.
1308
- * - _cache_strings=_ sets the value of the _cache_strings_ to a positive integer less than 35. Strings shorter than
1309
- * that length are cached.
1310
- * - _cache_strings_ returns the value of the _cache_strings_ integer value.
1311
- * - _cache_expunge=_ sets the value of the _cache_expunge_ where 0 never expunges, 1 expunges slowly, 2 expunges
1312
- * faster, and 3 or higher expunges agressively.
1313
- * - _cache_expunge_ returns the value of the _cache_expunge_ integer value.
1314
- * - _capacity=_ sets the capacity of the parser. The parser grows automatically but can be updated directly with this
1315
- * call.
1316
- * - _capacity_ returns the current capacity of the parser's internal stack.
1317
- * - _create_id_ returns the value _create_id_ or _nil_ if there is no _create_id_.
1318
- * - _create_id=_ sets the value _create_id_ or if _nil_ unsets it. Parsed JSON objects that include the specified
1319
- * element use the element value as the name of the class to create an object from instead of a Hash.
1320
- * - _decimal=_ sets the approach to how decimals are parser. If _:auto_ then the decimals with significant digits are
1321
- * 16 or less are Floats and long ones are BigDecimal. _:ruby_ uses a call to Ruby to convert a string to a Float.
1322
- * _:float_ always generates a Float. _:bigdecimal_ always results in a BigDecimal.
1323
- * - _decimal_ returns the value of the decimal conversion option which can be :auto (default), :ruby, :float, or
1324
- * :bigdecimal.
1325
- * - _ignore_json_create_ returns the value of the _ignore_json_create_ flag.
1326
- * - _ignore_json_create=_ sets the value of the _ignore_json_create_ flag. When set the class json_create method is
1327
- * ignored on parsing in favor of creating an instance and populating directly.
1328
- * - _missing_class_ return the value of the _missing_class_ indicator.
1329
- * - _missing_class=_ sets the value of the _missing_class_ flag. Valid values are _:auto_ which creates any missing
1330
- * classes on parse, :ignore which ignores and continues as a Hash (default), and :raise which raises an exception if
1331
- * the class is not found.
1332
- * - _omit_null=_ sets the _omit_null_ flag. If true then null values in a map or object are omitted from the
1333
- * resulting Hash or Object.
1334
- * - _omit_null_ returns the value of the _omit_null_ flag.
1335
- * - _symbol_keys=_ sets the flag that indicates Hash keys should be parsed to Symbols versus Strings.
1336
- * - _symbol_keys_ returns the value of the _symbol_keys_ flag.
1310
+ * - _cache_keys_ is a flag indicating hash keys should be cached.
1311
+ * - _cache_strings_ is a positive integer less than 35. Strings shorter than that length are cached.
1312
+ * - _cache_expunge_ dictates when the cache will be expunged where 0 never expunges,
1313
+ * 1 expunges slowly, 2 expunges faster, and 3 or higher expunges agressively.
1314
+ * - _capacity_ is the capacity of the parser's internal stack. The parser grows automatically
1315
+ * but can be updated directly with this call.
1316
+ * - _create_id_ if non-nil is the key that is used to specify the type of object to create
1317
+ * when parsing. Parsed JSON objects that include the specified element use the element
1318
+ * value as the name of the class to create an object from instead of a Hash.
1319
+ * - _decimal_ is the approach to how decimals are parsed. If _:auto_ then
1320
+ * the decimals with significant digits are 16 or less are Floats and long
1321
+ * ones are BigDecimal. _:ruby_ uses a call to Ruby to convert a string to a Float.
1322
+ * _:float_ always generates a Float. _:bigdecimal_ always results in a BigDecimal.
1323
+ * - _ignore_json_create_ is a flag that when set the class json_create method is
1324
+ * ignored on parsing in favor of creating an instance and populating directly.
1325
+ * - _missing_class_ is an indicator that determines how unknown class names are handled.
1326
+ * Valid values are _:auto_ which creates any missing classes on parse, :ignore which ignores
1327
+ * and continues as a Hash (default), and :raise which raises an exception if the class is not found.
1328
+ * - _omit_null_ is a flag that if true then null values in a map or object are omitted
1329
+ * from the resulting Hash or Object.
1330
+ * - _symbol_keys_ is a flag that indicates Hash keys should be parsed to Symbols versus Strings.
1337
1331
  */
1338
1332
  static VALUE parser_missing(int argc, VALUE *argv, VALUE self) {
1339
- ojParser p = (ojParser)DATA_PTR(self);
1333
+ ojParser p;
1340
1334
  const char *key = NULL;
1341
1335
  volatile VALUE rkey = *argv;
1342
1336
  volatile VALUE rv = Qnil;
1343
1337
 
1338
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1339
+
1344
1340
  #if HAVE_RB_EXT_RACTOR_SAFE
1345
1341
  // This doesn't seem to do anything.
1346
1342
  rb_ext_ractor_safe(true);
@@ -1349,7 +1345,7 @@ static VALUE parser_missing(int argc, VALUE *argv, VALUE self) {
1349
1345
  case RUBY_T_SYMBOL:
1350
1346
  rkey = rb_sym2str(rkey);
1351
1347
  // fall through
1352
- case RUBY_T_STRING: key = rb_string_value_ptr(&rkey); break;
1348
+ case RUBY_T_STRING: key = StringValuePtr(rkey); break;
1353
1349
  default: rb_raise(rb_eArgError, "option method must be a symbol or string");
1354
1350
  }
1355
1351
  if (1 < argc) {
@@ -1366,12 +1362,14 @@ static VALUE parser_missing(int argc, VALUE *argv, VALUE self) {
1366
1362
  * Returns the result according to the delegate of the parser.
1367
1363
  */
1368
1364
  static VALUE parser_parse(VALUE self, VALUE json) {
1369
- ojParser p = (ojParser)DATA_PTR(self);
1365
+ ojParser p;
1366
+ const byte *ptr = (const byte *)StringValuePtr(json);
1367
+
1368
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1370
1369
 
1371
- Check_Type(json, T_STRING);
1372
1370
  parser_reset(p);
1373
1371
  p->start(p);
1374
- parse(p, (const byte *)rb_string_value_ptr(&json));
1372
+ parse(p, ptr);
1375
1373
 
1376
1374
  return p->result(p);
1377
1375
  }
@@ -1382,15 +1380,23 @@ static VALUE load_rescue(VALUE self, VALUE x) {
1382
1380
  }
1383
1381
 
1384
1382
  static VALUE load(VALUE self) {
1385
- ojParser p = (ojParser)DATA_PTR(self);
1383
+ ojParser p;
1386
1384
  volatile VALUE rbuf = rb_str_new2("");
1387
1385
 
1386
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1387
+
1388
1388
  p->start(p);
1389
1389
  while (true) {
1390
1390
  rb_funcall(p->reader, oj_readpartial_id, 2, INT2NUM(16385), rbuf);
1391
1391
  if (0 < RSTRING_LEN(rbuf)) {
1392
1392
  parse(p, (byte *)StringValuePtr(rbuf));
1393
1393
  }
1394
+ if (Qtrue == rb_funcall(p->reader, oj_eofq_id, 0)) {
1395
+ if (0 < p->depth) {
1396
+ parse_error(p, "parse error, not closed");
1397
+ }
1398
+ break;
1399
+ }
1394
1400
  }
1395
1401
  return Qtrue;
1396
1402
  }
@@ -1403,7 +1409,9 @@ static VALUE load(VALUE self) {
1403
1409
  * Returns the result according to the delegate of the parser.
1404
1410
  */
1405
1411
  static VALUE parser_load(VALUE self, VALUE reader) {
1406
- ojParser p = (ojParser)DATA_PTR(self);
1412
+ ojParser p;
1413
+
1414
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1407
1415
 
1408
1416
  parser_reset(p);
1409
1417
  p->reader = reader;
@@ -1420,12 +1428,13 @@ static VALUE parser_load(VALUE self, VALUE reader) {
1420
1428
  * Returns the result according to the delegate of the parser.
1421
1429
  */
1422
1430
  static VALUE parser_file(VALUE self, VALUE filename) {
1423
- ojParser p = (ojParser)DATA_PTR(self);
1431
+ ojParser p;
1424
1432
  const char *path;
1425
1433
  int fd;
1426
1434
 
1427
- Check_Type(filename, T_STRING);
1428
- path = rb_string_value_ptr(&filename);
1435
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1436
+
1437
+ path = StringValuePtr(filename);
1429
1438
 
1430
1439
  parser_reset(p);
1431
1440
  p->start(p);
@@ -1468,7 +1477,9 @@ static VALUE parser_file(VALUE self, VALUE filename) {
1468
1477
  * Returns the current state of the just_one [_Boolean_] option.
1469
1478
  */
1470
1479
  static VALUE parser_just_one(VALUE self) {
1471
- ojParser p = (ojParser)DATA_PTR(self);
1480
+ ojParser p;
1481
+
1482
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1472
1483
 
1473
1484
  return p->just_one ? Qtrue : Qfalse;
1474
1485
  }
@@ -1482,7 +1493,9 @@ static VALUE parser_just_one(VALUE self) {
1482
1493
  * Returns the current state of the just_one [_Boolean_] option.
1483
1494
  */
1484
1495
  static VALUE parser_just_one_set(VALUE self, VALUE v) {
1485
- ojParser p = (ojParser)DATA_PTR(self);
1496
+ ojParser p;
1497
+
1498
+ TypedData_Get_Struct(self, struct _ojParser, &oj_parser_type, p);
1486
1499
 
1487
1500
  p->just_one = (Qtrue == v);
1488
1501
 
@@ -1499,14 +1512,14 @@ static VALUE usual_parser = Qundef;
1499
1512
  */
1500
1513
  static VALUE parser_usual(VALUE self) {
1501
1514
  if (Qundef == usual_parser) {
1502
- ojParser p = ALLOC(struct _ojParser);
1515
+ ojParser p = OJ_R_ALLOC(struct _ojParser);
1503
1516
 
1504
1517
  memset(p, 0, sizeof(struct _ojParser));
1505
1518
  buf_init(&p->key);
1506
1519
  buf_init(&p->buf);
1507
1520
  p->map = value_map;
1508
1521
  oj_set_parser_usual(p);
1509
- usual_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1522
+ usual_parser = TypedData_Wrap_Struct(parser_class, &oj_parser_type, p);
1510
1523
  rb_gc_register_address(&usual_parser);
1511
1524
  }
1512
1525
  return usual_parser;
@@ -1522,14 +1535,14 @@ static VALUE saj_parser = Qundef;
1522
1535
  */
1523
1536
  static VALUE parser_saj(VALUE self) {
1524
1537
  if (Qundef == saj_parser) {
1525
- ojParser p = ALLOC(struct _ojParser);
1538
+ ojParser p = OJ_R_ALLOC(struct _ojParser);
1526
1539
 
1527
1540
  memset(p, 0, sizeof(struct _ojParser));
1528
1541
  buf_init(&p->key);
1529
1542
  buf_init(&p->buf);
1530
1543
  p->map = value_map;
1531
1544
  oj_set_parser_saj(p);
1532
- saj_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1545
+ saj_parser = TypedData_Wrap_Struct(parser_class, &oj_parser_type, p);
1533
1546
  rb_gc_register_address(&saj_parser);
1534
1547
  }
1535
1548
  return saj_parser;
@@ -1544,14 +1557,14 @@ static VALUE validate_parser = Qundef;
1544
1557
  */
1545
1558
  static VALUE parser_validate(VALUE self) {
1546
1559
  if (Qundef == validate_parser) {
1547
- ojParser p = ALLOC(struct _ojParser);
1560
+ ojParser p = OJ_R_ALLOC(struct _ojParser);
1548
1561
 
1549
1562
  memset(p, 0, sizeof(struct _ojParser));
1550
1563
  buf_init(&p->key);
1551
1564
  buf_init(&p->buf);
1552
1565
  p->map = value_map;
1553
1566
  oj_set_parser_validator(p);
1554
- validate_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1567
+ validate_parser = TypedData_Wrap_Struct(parser_class, &oj_parser_type, p);
1555
1568
  rb_gc_register_address(&validate_parser);
1556
1569
  }
1557
1570
  return validate_parser;
data/ext/oj/parser.h CHANGED
@@ -4,8 +4,8 @@
4
4
  #ifndef OJ_PARSER_H
5
5
  #define OJ_PARSER_H
6
6
 
7
- #include <stdbool.h>
8
7
  #include <ruby.h>
8
+ #include <stdbool.h>
9
9
 
10
10
  #include "buf.h"
11
11
 
@@ -38,10 +38,12 @@ typedef struct _num {
38
38
  bool neg;
39
39
  bool exp_neg;
40
40
  // for numbers as strings, reuse buf
41
- } * Num;
41
+ } *Num;
42
42
 
43
43
  struct _ojParser;
44
44
 
45
+ extern const rb_data_type_t oj_parser_type;
46
+
45
47
  typedef struct _funcs {
46
48
  void (*add_null)(struct _ojParser *p);
47
49
  void (*add_true)(struct _ojParser *p);
@@ -54,11 +56,11 @@ typedef struct _funcs {
54
56
  void (*close_array)(struct _ojParser *p);
55
57
  void (*open_object)(struct _ojParser *p);
56
58
  void (*close_object)(struct _ojParser *p);
57
- } * Funcs;
59
+ } *Funcs;
58
60
 
59
61
  typedef struct _ojParser {
60
- const char * map;
61
- const char * next_map;
62
+ const char *map;
63
+ const char *next_map;
62
64
  int depth;
63
65
  unsigned char stack[1024];
64
66
 
@@ -67,7 +69,7 @@ typedef struct _ojParser {
67
69
  struct _buf key;
68
70
  struct _buf buf;
69
71
 
70
- struct _funcs funcs[3]; // indexed by XXX_FUN defines
72
+ struct _funcs funcs[3]; // indexed by XXX_FUN defines
71
73
 
72
74
  void (*start)(struct _ojParser *p);
73
75
  VALUE (*option)(struct _ojParser *p, const char *key, VALUE value);
@@ -86,7 +88,7 @@ typedef struct _ojParser {
86
88
  uint32_t ucode;
87
89
  ojType type; // valType
88
90
  bool just_one;
89
- } * ojParser;
91
+ } *ojParser;
90
92
 
91
93
  // Create a new parser without setting the delegate. The parser is
92
94
  // wrapped. The parser is (ojParser)DATA_PTR(value) where value is the return
@@ -98,5 +100,4 @@ extern VALUE oj_parser_new();
98
100
  // Set set the options from a hash (ropts).
99
101
  extern void oj_parser_set_option(ojParser p, VALUE ropts);
100
102
 
101
-
102
103
  #endif /* OJ_PARSER_H */