oj 3.12.3 → 3.13.3

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -3
  3. data/ext/oj/buf.h +9 -0
  4. data/ext/oj/cache.c +341 -0
  5. data/ext/oj/cache.h +21 -0
  6. data/ext/oj/compat.c +7 -22
  7. data/ext/oj/custom.c +15 -17
  8. data/ext/oj/debug.c +132 -0
  9. data/ext/oj/dump.c +12 -15
  10. data/ext/oj/dump_compat.c +3 -3
  11. data/ext/oj/dump_object.c +9 -9
  12. data/ext/oj/dump_strict.c +3 -3
  13. data/ext/oj/err.h +19 -0
  14. data/ext/oj/extconf.rb +5 -0
  15. data/ext/oj/fast.c +7 -18
  16. data/ext/oj/intern.c +281 -0
  17. data/ext/oj/intern.h +26 -0
  18. data/ext/oj/mimic_json.c +2 -2
  19. data/ext/oj/object.c +15 -92
  20. data/ext/oj/odd.c +1 -1
  21. data/ext/oj/oj.c +117 -94
  22. data/ext/oj/oj.h +1 -1
  23. data/ext/oj/parse.c +5 -5
  24. data/ext/oj/parser.c +1483 -0
  25. data/ext/oj/parser.h +90 -0
  26. data/ext/oj/rails.c +5 -5
  27. data/ext/oj/resolve.c +2 -20
  28. data/ext/oj/rxclass.c +1 -1
  29. data/ext/oj/saj.c +1 -1
  30. data/ext/oj/saj2.c +348 -0
  31. data/ext/oj/scp.c +1 -1
  32. data/ext/oj/sparse.c +2 -2
  33. data/ext/oj/stream_writer.c +4 -4
  34. data/ext/oj/strict.c +9 -27
  35. data/ext/oj/string_writer.c +2 -2
  36. data/ext/oj/usual.c +1252 -0
  37. data/ext/oj/validate.c +51 -0
  38. data/ext/oj/wab.c +14 -19
  39. data/lib/oj/error.rb +1 -1
  40. data/lib/oj/state.rb +8 -7
  41. data/lib/oj/version.rb +1 -1
  42. data/pages/Options.md +1 -1
  43. data/pages/Parser.md +309 -0
  44. data/pages/Rails.md +2 -2
  45. data/test/json_gem/json_generator_test.rb +1 -1
  46. data/test/mem.rb +33 -0
  47. data/test/perf_once.rb +58 -0
  48. data/test/perf_parser.rb +189 -0
  49. data/test/test_hash.rb +1 -1
  50. data/test/test_parser.rb +27 -0
  51. data/test/test_parser_saj.rb +245 -0
  52. data/test/test_parser_usual.rb +213 -0
  53. metadata +26 -5
  54. data/ext/oj/hash.c +0 -168
  55. data/ext/oj/hash.h +0 -21
  56. data/ext/oj/hash_test.c +0 -491
data/ext/oj/custom.c CHANGED
@@ -8,7 +8,7 @@
8
8
  #include "dump.h"
9
9
  #include "encode.h"
10
10
  #include "err.h"
11
- #include "hash.h"
11
+ #include "intern.h"
12
12
  #include "odd.h"
13
13
  #include "oj.h"
14
14
  #include "parse.h"
@@ -31,14 +31,14 @@ static void dump_obj_str(VALUE obj, int depth, Out out) {
31
31
 
32
32
  static void dump_obj_as_str(VALUE obj, int depth, Out out) {
33
33
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
34
- const char * str = rb_string_value_ptr((VALUE *)&rstr);
34
+ const char * str = RSTRING_PTR(rstr);
35
35
 
36
36
  oj_dump_cstr(str, RSTRING_LEN(rstr), 0, 0, out);
37
37
  }
38
38
 
39
39
  static void bigdecimal_dump(VALUE obj, int depth, Out out) {
40
40
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
41
- const char * str = rb_string_value_ptr((VALUE *)&rstr);
41
+ const char * str = RSTRING_PTR(rstr);
42
42
  int len = (int)RSTRING_LEN(rstr);
43
43
 
44
44
  if (0 == strcasecmp("Infinity", str)) {
@@ -123,7 +123,7 @@ static void date_dump(VALUE obj, int depth, Out out) {
123
123
  case RubyTime:
124
124
  case XmlTime:
125
125
  v = rb_funcall(obj, rb_intern("iso8601"), 0);
126
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&v), (int)RSTRING_LEN(v), 0, 0, out);
126
+ oj_dump_cstr(RSTRING_PTR(v), (int)RSTRING_LEN(v), 0, 0, out);
127
127
  break;
128
128
  case UnixZTime:
129
129
  v = rb_funcall(obj, rb_intern("to_time"), 0);
@@ -420,7 +420,7 @@ static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
420
420
  if (Qundef == v || T_STRING != rb_type(v)) {
421
421
  rb_raise(rb_eEncodingError, "Invalid type for raw JSON.\n");
422
422
  } else {
423
- const char *s = rb_string_value_ptr((VALUE *)&v);
423
+ const char *s = RSTRING_PTR(v);
424
424
  int len = (int)RSTRING_LEN(v);
425
425
  const char *name = rb_id2name(*odd->attrs);
426
426
  size_t nlen = strlen(name);
@@ -510,7 +510,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
510
510
  if (Yes == out->opts->trace) {
511
511
  oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
512
512
  }
513
- s = rb_string_value_ptr((VALUE *)&rs);
513
+ s = RSTRING_PTR(rs);
514
514
  len = (int)RSTRING_LEN(rs);
515
515
 
516
516
  assure_size(out, len + 1);
@@ -537,7 +537,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
537
537
  if (aj == obj) {
538
538
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
539
539
 
540
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&rstr),
540
+ oj_dump_cstr(RSTRING_PTR(rstr),
541
541
  (int)RSTRING_LEN(rstr),
542
542
  false,
543
543
  false,
@@ -833,9 +833,9 @@ static void dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
833
833
  v = rb_struct_aref(obj, INT2FIX(i));
834
834
  #endif
835
835
  if (ma != Qnil) {
836
- volatile VALUE s = rb_sym_to_s(rb_ary_entry(ma, i));
836
+ volatile VALUE s = rb_sym2str(rb_ary_entry(ma, i));
837
837
 
838
- name = rb_string_value_ptr((VALUE *)&s);
838
+ name = RSTRING_PTR(s);
839
839
  len = (int)RSTRING_LEN(s);
840
840
  } else {
841
841
  len = snprintf(num_id, sizeof(num_id), "%d", i);
@@ -956,14 +956,13 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
956
956
  }
957
957
  } else {
958
958
  //volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
959
- volatile VALUE rstr = rb_str_new(str, len);
959
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
960
960
 
961
961
  if (Qundef == rkey) {
962
- rkey = rb_str_new(key, klen);
963
- rstr = oj_encode(rstr);
964
- rkey = oj_encode(rkey);
965
962
  if (Yes == pi->options.sym_key) {
966
- rkey = rb_str_intern(rkey);
963
+ rkey = ID2SYM(rb_intern3(key, klen, oj_utf8_encoding));
964
+ } else {
965
+ rkey = rb_utf8_str_new(key, klen);
967
966
  }
968
967
  }
969
968
  if (Yes == pi->options.create_ok && NULL != pi->options.str_rx.head) {
@@ -1031,7 +1030,7 @@ static void hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
1031
1030
  }
1032
1031
  if (86400 == ni->exp) { // UTC time
1033
1032
  parent->val = rb_time_nano_new(ni->i, (long)nsec);
1034
- // Since the ruby C routines alway create local time, the
1033
+ // Since the ruby C routines always create local time, the
1035
1034
  // offset and then a conversion to UTC keeps makes the time
1036
1035
  // match the expected value.
1037
1036
  parent->val = rb_funcall2(parent->val, oj_utc_id, 0, 0);
@@ -1089,9 +1088,8 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
1089
1088
  }
1090
1089
 
1091
1090
  static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
1092
- volatile VALUE rstr = rb_str_new(str, len);
1091
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
1093
1092
 
1094
- rstr = oj_encode(rstr);
1095
1093
  if (Yes == pi->options.create_ok && NULL != pi->options.str_rx.head) {
1096
1094
  VALUE clas = oj_rxclass_match(&pi->options.str_rx, str, (int)len);
1097
1095
 
data/ext/oj/debug.c ADDED
@@ -0,0 +1,132 @@
1
+ // Copyright (c) 2021, Peter Ohler, All rights reserved.
2
+
3
+ #include "parser.h"
4
+
5
+ static void add_null(struct _ojParser *p) {
6
+ switch (p->stack[p->depth]) {
7
+ case TOP_FUN: printf("*** add_null at top\n"); break;
8
+ case ARRAY_FUN: printf("*** add_null to array\n"); break;
9
+ case OBJECT_FUN: printf("*** add_null with '%s'\n", buf_str(&p->key)); break;
10
+ }
11
+ }
12
+
13
+ static void add_true(struct _ojParser *p) {
14
+ switch (p->stack[p->depth]) {
15
+ case TOP_FUN: printf("*** add_true at top\n"); break;
16
+ case ARRAY_FUN: printf("*** add_true to array\n"); break;
17
+ case OBJECT_FUN: printf("*** add_true with '%s'\n", buf_str(&p->key)); break;
18
+ }
19
+ }
20
+
21
+ static void add_false(struct _ojParser *p) {
22
+ switch (p->stack[p->depth]) {
23
+ case TOP_FUN: printf("*** add_false at top\n"); break;
24
+ case ARRAY_FUN: printf("*** add_false to array\n"); break;
25
+ case OBJECT_FUN: printf("*** add_false with '%s'\n", buf_str(&p->key)); break;
26
+ }
27
+ }
28
+
29
+ static void add_int(struct _ojParser *p) {
30
+ switch (p->stack[p->depth]) {
31
+ case TOP_FUN: printf("*** add_int %lld at top\n", (long long)p->num.fixnum); break;
32
+ case ARRAY_FUN: printf("*** add_int %lld to array\n", (long long)p->num.fixnum); break;
33
+ case OBJECT_FUN:
34
+ printf("*** add_int %lld with '%s'\n", (long long)p->num.fixnum, buf_str(&p->key));
35
+ break;
36
+ }
37
+ }
38
+
39
+ static void add_float(struct _ojParser *p) {
40
+ switch (p->stack[p->depth]) {
41
+ case TOP_FUN: printf("*** add_float %Lf at top\n", p->num.dub); break;
42
+ case ARRAY_FUN: printf("*** add_float %Lf to array\n", p->num.dub); break;
43
+ case OBJECT_FUN: printf("*** add_float %Lf with '%s'\n", p->num.dub, buf_str(&p->key)); break;
44
+ }
45
+ }
46
+
47
+ static void add_big(struct _ojParser *p) {
48
+ switch (p->stack[p->depth]) {
49
+ case TOP_FUN: printf("*** add_big %s at top\n", buf_str(&p->buf)); break;
50
+ case ARRAY_FUN: printf("*** add_big %s to array\n", buf_str(&p->buf)); break;
51
+ case OBJECT_FUN:
52
+ printf("*** add_big %s with '%s'\n", buf_str(&p->buf), buf_str(&p->key));
53
+ break;
54
+ }
55
+ }
56
+
57
+ static void add_str(struct _ojParser *p) {
58
+ switch (p->stack[p->depth]) {
59
+ case TOP_FUN: printf("*** add_str '%s' at top\n", buf_str(&p->buf)); break;
60
+ case ARRAY_FUN: printf("*** add_str '%s' to array\n", buf_str(&p->buf)); break;
61
+ case OBJECT_FUN:
62
+ printf("*** add_str '%s' with '%s'\n", buf_str(&p->buf), buf_str(&p->key));
63
+ break;
64
+ }
65
+ }
66
+
67
+ static void open_array(struct _ojParser *p) {
68
+ switch (p->stack[p->depth]) {
69
+ case TOP_FUN: printf("*** open_array at top\n"); break;
70
+ case ARRAY_FUN: printf("*** open_array to array\n"); break;
71
+ case OBJECT_FUN: printf("*** open_array with '%s'\n", buf_str(&p->key)); break;
72
+ }
73
+ }
74
+
75
+ static void close_array(struct _ojParser *p) {
76
+ printf("*** close_array\n");
77
+ }
78
+
79
+ static void open_object(struct _ojParser *p) {
80
+ switch (p->stack[p->depth]) {
81
+ case TOP_FUN: printf("*** open_object at top\n"); break;
82
+ case ARRAY_FUN: printf("*** open_object to array\n"); break;
83
+ case OBJECT_FUN: printf("*** open_object with '%s'\n", buf_str(&p->key)); break;
84
+ }
85
+ }
86
+
87
+ static void close_object(struct _ojParser *p) {
88
+ printf("*** close_object\n");
89
+ }
90
+
91
+ static VALUE option(ojParser p, const char *key, VALUE value) {
92
+ rb_raise(rb_eArgError, "%s is not an option for the debug delegate", key);
93
+ return Qnil;
94
+ }
95
+
96
+ static VALUE result(struct _ojParser *p) {
97
+ return Qnil;
98
+ }
99
+
100
+ static void start(struct _ojParser *p) {
101
+ printf("*** start\n");
102
+ }
103
+
104
+ static void dfree(struct _ojParser *p) {
105
+ }
106
+
107
+ static void mark(struct _ojParser *p) {
108
+ }
109
+
110
+ void oj_set_parser_debug(ojParser p) {
111
+ Funcs end = p->funcs + 3;
112
+ Funcs f;
113
+
114
+ for (f = p->funcs; f < end; f++) {
115
+ f->add_null = add_null;
116
+ f->add_true = add_true;
117
+ f->add_false = add_false;
118
+ f->add_int = add_int;
119
+ f->add_float = add_float;
120
+ f->add_big = add_big;
121
+ f->add_str = add_str;
122
+ f->open_array = open_array;
123
+ f->close_array = close_array;
124
+ f->open_object = open_object;
125
+ f->close_object = close_object;
126
+ }
127
+ p->option = option;
128
+ p->result = result;
129
+ p->free = dfree;
130
+ p->mark = mark;
131
+ p->start = start;
132
+ }
data/ext/oj/dump.c CHANGED
@@ -472,7 +472,7 @@ void oj_dump_time(VALUE obj, Out out, int withZone) {
472
472
  void oj_dump_ruby_time(VALUE obj, Out out) {
473
473
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
474
474
 
475
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&rstr), (int)RSTRING_LEN(rstr), 0, 0, out);
475
+ oj_dump_cstr(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), 0, 0, out);
476
476
  }
477
477
 
478
478
  void oj_dump_xml_time(VALUE obj, Out out) {
@@ -708,21 +708,18 @@ void oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts) {
708
708
  }
709
709
 
710
710
  void oj_dump_str(VALUE obj, int depth, Out out, bool as_ok) {
711
- rb_encoding *enc = rb_to_encoding(rb_obj_encoding(obj));
711
+ rb_encoding *enc = rb_enc_get(obj);
712
712
 
713
- if (rb_utf8_encoding() != enc) {
714
- obj = rb_str_conv_enc(obj, enc, rb_utf8_encoding());
713
+ if (oj_utf8_encoding != enc) {
714
+ obj = rb_str_conv_enc(obj, enc, oj_utf8_encoding);
715
715
  }
716
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&obj), (int)RSTRING_LEN(obj), 0, 0, out);
716
+ oj_dump_cstr(RSTRING_PTR(obj), (int)RSTRING_LEN(obj), 0, 0, out);
717
717
  }
718
718
 
719
719
  void oj_dump_sym(VALUE obj, int depth, Out out, bool as_ok) {
720
- // This causes a memory leak in 2.5.1. Maybe in other versions as well.
721
- // const char *sym = rb_id2name(SYM2ID(obj));
720
+ volatile VALUE s = rb_sym2str(obj);
722
721
 
723
- volatile VALUE s = rb_sym_to_s(obj);
724
-
725
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&s), (int)RSTRING_LEN(s), 0, 0, out);
722
+ oj_dump_cstr(RSTRING_PTR(s), (int)RSTRING_LEN(s), 0, 0, out);
726
723
  }
727
724
 
728
725
  static void debug_raise(const char *orig, size_t cnt, int line) {
@@ -760,7 +757,7 @@ void oj_dump_raw_json(VALUE obj, int depth, Out out) {
760
757
  if (Yes == out->opts->trace) {
761
758
  oj_trace("raw_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
762
759
  }
763
- oj_dump_raw(rb_string_value_ptr((VALUE *)&jv), (size_t)RSTRING_LEN(jv), out);
760
+ oj_dump_raw(RSTRING_PTR(jv), (size_t)RSTRING_LEN(jv), out);
764
761
  }
765
762
  }
766
763
 
@@ -958,7 +955,7 @@ void oj_dump_class(VALUE obj, int depth, Out out, bool as_ok) {
958
955
  void oj_dump_obj_to_s(VALUE obj, Out out) {
959
956
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
960
957
 
961
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&rstr), (int)RSTRING_LEN(rstr), 0, 0, out);
958
+ oj_dump_cstr(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), 0, 0, out);
962
959
  }
963
960
 
964
961
  void oj_dump_raw(const char *str, size_t cnt, Out out) {
@@ -1075,7 +1072,7 @@ void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok) {
1075
1072
  } else {
1076
1073
  assure_size(out, cnt);
1077
1074
  }
1078
- memcpy(out->cur, rb_string_value_ptr((VALUE *)&rs), cnt);
1075
+ memcpy(out->cur, RSTRING_PTR(rs), cnt);
1079
1076
  out->cur += cnt;
1080
1077
  if (dump_as_string) {
1081
1078
  *out->cur++ = '"';
@@ -1203,7 +1200,7 @@ void oj_dump_float(VALUE obj, int depth, Out out, bool as_ok) {
1203
1200
  if ((int)sizeof(buf) <= cnt) {
1204
1201
  cnt = sizeof(buf) - 1;
1205
1202
  }
1206
- memcpy(buf, rb_string_value_ptr((VALUE *)&rstr), cnt);
1203
+ memcpy(buf, RSTRING_PTR(rstr), cnt);
1207
1204
  buf[cnt] = '\0';
1208
1205
  } else {
1209
1206
  cnt = oj_dump_float_printf(buf, sizeof(buf), obj, d, out->opts->float_fmt);
@@ -1223,7 +1220,7 @@ int oj_dump_float_printf(char *buf, size_t blen, VALUE obj, double d, const char
1223
1220
  if (17 <= cnt && (0 == strcmp("0001", buf + cnt - 4) || 0 == strcmp("9999", buf + cnt - 4))) {
1224
1221
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
1225
1222
 
1226
- strcpy(buf, rb_string_value_ptr((VALUE *)&rstr));
1223
+ strcpy(buf, RSTRING_PTR(rstr));
1227
1224
  cnt = (int)RSTRING_LEN(rstr);
1228
1225
  }
1229
1226
  return cnt;
data/ext/oj/dump_compat.c CHANGED
@@ -129,7 +129,7 @@ dump_to_json(VALUE obj, Out out) {
129
129
  oj_trace("to_json", obj, __FILE__, __LINE__, 0, TraceRubyOut);
130
130
  }
131
131
 
132
- s = rb_string_value_ptr((VALUE*)&rs);
132
+ s = RSTRING_PTR(rs);
133
133
  len = (int)RSTRING_LEN(rs);
134
134
 
135
135
  assure_size(out, len + 1);
@@ -635,7 +635,7 @@ dump_float(VALUE obj, int depth, Out out, bool as_ok) {
635
635
  } else {
636
636
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
637
637
 
638
- strcpy(buf, rb_string_value_ptr((VALUE*)&rstr));
638
+ strcpy(buf, RSTRING_PTR(rstr));
639
639
  cnt = (int)RSTRING_LEN(rstr);
640
640
  }
641
641
  assure_size(out, cnt);
@@ -886,7 +886,7 @@ dump_bignum(VALUE obj, int depth, Out out, bool as_ok) {
886
886
  } else {
887
887
  assure_size(out, cnt);
888
888
  }
889
- memcpy(out->cur, rb_string_value_ptr((VALUE*)&rs), cnt);
889
+ memcpy(out->cur, RSTRING_PTR(rs), cnt);
890
890
  out->cur += cnt;
891
891
  if (dump_as_string) {
892
892
  *out->cur++ = '"';
data/ext/oj/dump_object.c CHANGED
@@ -36,7 +36,7 @@ static void dump_data(VALUE obj, int depth, Out out, bool as_ok) {
36
36
  } else {
37
37
  if (oj_bigdecimal_class == clas) {
38
38
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
39
- const char * str = rb_string_value_ptr((VALUE *)&rstr);
39
+ const char * str = RSTRING_PTR(rstr);
40
40
  int len = (int)RSTRING_LEN(rstr);
41
41
 
42
42
  if (No != out->opts->bigdec_as_num) {
@@ -65,7 +65,7 @@ static void dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
65
65
 
66
66
  if (oj_bigdecimal_class == clas) {
67
67
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
68
- const char * str = rb_string_value_ptr((VALUE *)&rstr);
68
+ const char * str = RSTRING_PTR(rstr);
69
69
  int len = (int)RSTRING_LEN(rstr);
70
70
 
71
71
  if (0 == strcasecmp("Infinity", str)) {
@@ -195,7 +195,7 @@ static void dump_str_class(VALUE obj, VALUE clas, int depth, Out out) {
195
195
  if (Qundef != clas && rb_cString != clas) {
196
196
  dump_obj_attrs(obj, clas, 0, depth, out);
197
197
  } else {
198
- const char *s = rb_string_value_ptr((VALUE *)&obj);
198
+ const char *s = RSTRING_PTR(obj);
199
199
  size_t len = (int)RSTRING_LEN(obj);
200
200
  char s1 = s[1];
201
201
 
@@ -208,9 +208,9 @@ static void dump_str(VALUE obj, int depth, Out out, bool as_ok) {
208
208
  }
209
209
 
210
210
  static void dump_sym(VALUE obj, int depth, Out out, bool as_ok) {
211
- volatile VALUE s = rb_sym_to_s(obj);
211
+ volatile VALUE s = rb_sym2str(obj);
212
212
 
213
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&s), (int)RSTRING_LEN(s), 1, 0, out);
213
+ oj_dump_cstr(RSTRING_PTR(s), (int)RSTRING_LEN(s), 1, 0, out);
214
214
  }
215
215
 
216
216
  static int hash_cb(VALUE key, VALUE value, VALUE ov) {
@@ -414,7 +414,7 @@ static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
414
414
  if (Qundef == v || T_STRING != rb_type(v)) {
415
415
  rb_raise(rb_eEncodingError, "Invalid type for raw JSON.");
416
416
  } else {
417
- const char *s = rb_string_value_ptr((VALUE *)&v);
417
+ const char *s = RSTRING_PTR(v);
418
418
  int len = (int)RSTRING_LEN(v);
419
419
  const char *name = rb_id2name(*odd->attrs);
420
420
  size_t nlen = strlen(name);
@@ -532,7 +532,7 @@ static void dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out)
532
532
  *out->cur++ = 'f';
533
533
  *out->cur++ = '"';
534
534
  *out->cur++ = ':';
535
- oj_dump_cstr(rb_string_value_ptr((VALUE *)&obj), (int)RSTRING_LEN(obj), 0, 0, out);
535
+ oj_dump_cstr(RSTRING_PTR(obj), (int)RSTRING_LEN(obj), 0, 0, out);
536
536
  break;
537
537
  case T_ARRAY:
538
538
  assure_size(out, d2 * out->indent + 14);
@@ -694,9 +694,9 @@ static void dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
694
694
 
695
695
  *out->cur++ = '[';
696
696
  for (i = 0; i < cnt; i++) {
697
- volatile VALUE s = rb_sym_to_s(rb_ary_entry(ma, i));
697
+ volatile VALUE s = rb_sym2str(rb_ary_entry(ma, i));
698
698
 
699
- name = rb_string_value_ptr((VALUE *)&s);
699
+ name = RSTRING_PTR(s);
700
700
  len = (int)RSTRING_LEN(s);
701
701
  size = len + 3;
702
702
  assure_size(out, size);
data/ext/oj/dump_strict.c CHANGED
@@ -98,7 +98,7 @@ static void dump_float(VALUE obj, int depth, Out out, bool as_ok) {
98
98
  if ((int)sizeof(buf) <= cnt) {
99
99
  cnt = sizeof(buf) - 1;
100
100
  }
101
- memcpy(buf, rb_string_value_ptr((VALUE *)&rstr), cnt);
101
+ memcpy(buf, RSTRING_PTR(rstr), cnt);
102
102
  buf[cnt] = '\0';
103
103
  } else {
104
104
  cnt = oj_dump_float_printf(buf, sizeof(buf), obj, d, out->opts->float_fmt);
@@ -304,7 +304,7 @@ static void dump_data_strict(VALUE obj, int depth, Out out, bool as_ok) {
304
304
  if (oj_bigdecimal_class == clas) {
305
305
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
306
306
 
307
- oj_dump_raw(rb_string_value_ptr((VALUE *)&rstr), (int)RSTRING_LEN(rstr), out);
307
+ oj_dump_raw(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), out);
308
308
  } else {
309
309
  raise_strict(obj);
310
310
  }
@@ -316,7 +316,7 @@ static void dump_data_null(VALUE obj, int depth, Out out, bool as_ok) {
316
316
  if (oj_bigdecimal_class == clas) {
317
317
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
318
318
 
319
- oj_dump_raw(rb_string_value_ptr((VALUE *)&rstr), (int)RSTRING_LEN(rstr), out);
319
+ oj_dump_raw(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), out);
320
320
  } else {
321
321
  oj_dump_nil(Qnil, depth, out, false);
322
322
  }
data/ext/oj/err.h CHANGED
@@ -4,12 +4,31 @@
4
4
  #ifndef OJ_ERR_H
5
5
  #define OJ_ERR_H
6
6
 
7
+ #include <errno.h>
7
8
  #include "ruby.h"
9
+
8
10
  // Needed to silence 2.4.0 warnings.
9
11
  #ifndef NORETURN
10
12
  #define NORETURN(x) x
11
13
  #endif
12
14
 
15
+ #define OJ_ERR_START 300
16
+
17
+ typedef enum {
18
+ OJ_OK = 0,
19
+ OJ_ERR_MEMORY = ENOMEM,
20
+ OJ_ERR_PARSE = OJ_ERR_START,
21
+ OJ_ERR_READ,
22
+ OJ_ERR_WRITE,
23
+ OJ_ERR_OVERFLOW,
24
+ OJ_ERR_ARG,
25
+ OJ_ERR_TOO_MANY,
26
+ OJ_ERR_TYPE,
27
+ OJ_ERR_KEY,
28
+ OJ_ABORT,
29
+ OJ_ERR_LAST,
30
+ } ojStatus;
31
+
13
32
  #define set_error(err, eclas, msg, json, current) \
14
33
  _oj_err_set_with_location(err, eclas, msg, json, current, FILE, LINE)
15
34