oj 3.12.3 → 3.13.3

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