oj 3.13.15 → 3.13.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2dd6fd9c107efe5095ca235c398e2fb7cc4fb9cdd9feffb4f27fef1ed1e3faa3
4
- data.tar.gz: 072e3744f4cbb880f1e5296ad1abba448341d9934173fa101ba1d65efe20de64
3
+ metadata.gz: e7ca20e7921e7b9a3e2838ecbe3505ecb736bce338113a3db3187f411d1762ca
4
+ data.tar.gz: 6c09a24ddb7017caa2a2850076a6b0fcbccc6ed27cd6e28e28de7fadacbaa7fe
5
5
  SHA512:
6
- metadata.gz: 76fbaa3e575553ffbf37e45447429b58da392d58e59afa82491363a17ee3ab7cacf5283986db7242f1cf8b0340449d8a1d97a6f54c288076110a2fdc5ccebf30
7
- data.tar.gz: 116f07d7db9124f62007eff33a2583f4de5a1338009fec59eca267a483be229285a7ec66c6fbb1feb92f05284afe76ae39629aca2e8f2a7ff20caa27adddc0c4
6
+ metadata.gz: 9e1bb01e19979391421d87b0598ff543ce3035a86fcbb06a68b63d4b56f4194739213d506fdd0492f5cf4a2aabd037872935fcb16f5d083fd6e532c6aa869b8d
7
+ data.tar.gz: 29db51398d6008cbcb827af666da0b41b750f6aea3e561fe37b2354f48b88d2bf393dcbfed931679072042bd19cf179ec0ae674027527b627391c2c4792f3c63
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.13.18 - 2022-07-25
4
+
5
+ - Fixed SSE detection at run time.
6
+
7
+ ## 3.13.17 - 2022-07-15
8
+
9
+ - Fixed Oj::Parser to detect unterminated arrays and objects.
10
+
11
+ ## 3.13.16 - 2022-07-06
12
+
13
+ - Added line and column as optional arguments to the Oj::Parser.saj parser.
14
+
3
15
  ## 3.13.15 - 2022-07-03
4
16
 
5
17
  - Fixed issue dumping NaN value in object mode.
data/ext/oj/buf.h CHANGED
@@ -39,6 +39,10 @@ inline static const char *buf_str(Buf buf) {
39
39
  }
40
40
 
41
41
  inline static void buf_append_string(Buf buf, const char *s, size_t slen) {
42
+ if (0 == slen) {
43
+ return;
44
+ }
45
+
42
46
  if (buf->end <= buf->tail + slen) {
43
47
  size_t len = buf->end - buf->head;
44
48
  size_t toff = buf->tail - buf->head;
data/ext/oj/compat.c CHANGED
@@ -54,7 +54,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
54
54
  } else {
55
55
  rb_hash_aset(parent->val, rkey, rstr);
56
56
  }
57
- if (Yes == pi->options.trace) {
57
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
58
58
  oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
59
59
  }
60
60
  }
@@ -68,7 +68,7 @@ static VALUE start_hash(ParseInfo pi) {
68
68
  } else {
69
69
  h = rb_hash_new();
70
70
  }
71
- if (Yes == pi->options.trace) {
71
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
72
72
  oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
73
73
  }
74
74
  return h;
@@ -93,7 +93,7 @@ static void end_hash(struct _parseInfo *pi) {
93
93
  parent->classname = 0;
94
94
  }
95
95
  }
96
- if (Yes == pi->options.trace) {
96
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
97
97
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
98
98
  }
99
99
  }
@@ -110,14 +110,14 @@ static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig
110
110
  }
111
111
  }
112
112
  pi->stack.head->val = rstr;
113
- if (Yes == pi->options.trace) {
113
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
114
114
  oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
115
115
  }
116
116
  }
117
117
 
118
118
  static void add_num(ParseInfo pi, NumInfo ni) {
119
119
  pi->stack.head->val = oj_num_as_value(ni);
120
- if (Yes == pi->options.trace) {
120
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
121
121
  oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
122
122
  }
123
123
  }
@@ -138,7 +138,7 @@ static void hash_set_num(struct _parseInfo *pi, Val parent, NumInfo ni) {
138
138
  } else {
139
139
  rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), rval);
140
140
  }
141
- if (Yes == pi->options.trace) {
141
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
142
142
  oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, rval);
143
143
  }
144
144
  }
@@ -157,7 +157,7 @@ static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
157
157
  } else {
158
158
  rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), value);
159
159
  }
160
- if (Yes == pi->options.trace) {
160
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
161
161
  oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
162
162
  }
163
163
  }
@@ -166,7 +166,7 @@ static VALUE start_array(ParseInfo pi) {
166
166
  if (Qnil != pi->options.array_class) {
167
167
  return rb_class_new_instance(0, NULL, pi->options.array_class);
168
168
  }
169
- if (Yes == pi->options.trace) {
169
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
170
170
  oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
171
171
  }
172
172
  return rb_ary_new();
@@ -184,7 +184,7 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
184
184
  } else {
185
185
  rb_ary_push(parent->val, rval);
186
186
  }
187
- if (Yes == pi->options.trace) {
187
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
188
188
  oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
189
189
  }
190
190
  }
@@ -201,7 +201,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
201
201
  }
202
202
  }
203
203
  rb_ary_push(stack_peek(&pi->stack)->val, rstr);
204
- if (Yes == pi->options.trace) {
204
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
205
205
  oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
206
206
  }
207
207
  }
data/ext/oj/custom.c CHANGED
@@ -484,7 +484,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
484
484
  const char * s;
485
485
  int len;
486
486
 
487
- if (Yes == out->opts->trace) {
487
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
488
488
  oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
489
489
  }
490
490
  if (0 == rb_obj_method_arity(obj, oj_to_json_id)) {
@@ -492,7 +492,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
492
492
  } else {
493
493
  rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
494
494
  }
495
- if (Yes == out->opts->trace) {
495
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
496
496
  oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
497
497
  }
498
498
  s = RSTRING_PTR(rs);
@@ -504,7 +504,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
504
504
  } else if (Yes == out->opts->as_json && rb_respond_to(obj, oj_as_json_id)) {
505
505
  volatile VALUE aj;
506
506
 
507
- if (Yes == out->opts->trace) {
507
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
508
508
  oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
509
509
  }
510
510
  // Some classes elect to not take an options argument so check the arity
@@ -514,7 +514,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
514
514
  } else {
515
515
  aj = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
516
516
  }
517
- if (Yes == out->opts->trace) {
517
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
518
518
  oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
519
519
  }
520
520
  // Catch the obvious brain damaged recursive dumping.
@@ -885,7 +885,7 @@ static DumpFunc custom_funcs[] = {
885
885
  void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok) {
886
886
  int type = rb_type(obj);
887
887
 
888
- if (Yes == out->opts->trace) {
888
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
889
889
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
890
890
  }
891
891
  if (MAX_DEPTH < depth) {
@@ -896,14 +896,14 @@ void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok) {
896
896
 
897
897
  if (NULL != f) {
898
898
  f(obj, depth, out, true);
899
- if (Yes == out->opts->trace) {
899
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
900
900
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
901
901
  }
902
902
  return;
903
903
  }
904
904
  }
905
905
  oj_dump_nil(Qnil, depth, out, false);
906
- if (Yes == out->opts->trace) {
906
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
907
907
  oj_trace("dump", Qnil, __FILE__, __LINE__, depth, TraceOut);
908
908
  }
909
909
  }
@@ -959,7 +959,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
959
959
  break;
960
960
  default: break;
961
961
  }
962
- if (Yes == pi->options.trace) {
962
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
963
963
  oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
964
964
  }
965
965
  }
@@ -978,7 +978,7 @@ static void end_hash(struct _parseInfo *pi) {
978
978
  }
979
979
  parent->clas = Qundef;
980
980
  }
981
- if (Yes == pi->options.trace) {
981
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
982
982
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
983
983
  }
984
984
  }
@@ -1032,7 +1032,7 @@ static void hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
1032
1032
  break;
1033
1033
  default: break;
1034
1034
  }
1035
- if (Yes == pi->options.trace) {
1035
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
1036
1036
  oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rval);
1037
1037
  }
1038
1038
  }
@@ -1045,7 +1045,7 @@ static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
1045
1045
  case T_HASH: rb_hash_aset(parent->val, oj_calc_hash_key(pi, kval), value); break;
1046
1046
  default: break;
1047
1047
  }
1048
- if (Yes == pi->options.trace) {
1048
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
1049
1049
  oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
1050
1050
  }
1051
1051
  }
@@ -1055,7 +1055,7 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
1055
1055
  volatile VALUE rval = oj_num_as_value(ni);
1056
1056
 
1057
1057
  rb_ary_push(parent->val, rval);
1058
- if (Yes == pi->options.trace) {
1058
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
1059
1059
  oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
1060
1060
  }
1061
1061
  }
@@ -1072,7 +1072,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
1072
1072
  }
1073
1073
  }
1074
1074
  rb_ary_push(stack_peek(&pi->stack)->val, rstr);
1075
- if (Yes == pi->options.trace) {
1075
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
1076
1076
  oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
1077
1077
  }
1078
1078
  }
data/ext/oj/dump.c CHANGED
@@ -736,11 +736,11 @@ void oj_dump_raw_json(VALUE obj, int depth, Out out) {
736
736
  } else {
737
737
  volatile VALUE jv;
738
738
 
739
- if (Yes == out->opts->trace) {
739
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
740
740
  oj_trace("raw_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
741
741
  }
742
742
  jv = rb_funcall(obj, oj_raw_json_id, 2, RB_INT2NUM(depth), RB_INT2NUM(out->indent));
743
- if (Yes == out->opts->trace) {
743
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
744
744
  oj_trace("raw_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
745
745
  }
746
746
  oj_dump_raw(RSTRING_PTR(jv), (size_t)RSTRING_LEN(jv), out);
data/ext/oj/dump_compat.c CHANGED
@@ -109,7 +109,7 @@ dump_to_json(VALUE obj, Out out) {
109
109
  const char *s;
110
110
  int len;
111
111
 
112
- if (Yes == out->opts->trace) {
112
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
113
113
  oj_trace("to_json", obj, __FILE__, __LINE__, 0, TraceRubyIn);
114
114
  }
115
115
  if (0 == rb_obj_method_arity(obj, oj_to_json_id)) {
@@ -117,7 +117,7 @@ dump_to_json(VALUE obj, Out out) {
117
117
  } else {
118
118
  rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
119
119
  }
120
- if (Yes == out->opts->trace) {
120
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
121
121
  oj_trace("to_json", obj, __FILE__, __LINE__, 0, TraceRubyOut);
122
122
  }
123
123
 
@@ -893,7 +893,7 @@ void
893
893
  oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok) {
894
894
  int type = rb_type(obj);
895
895
 
896
- if (Yes == out->opts->trace) {
896
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
897
897
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
898
898
  }
899
899
  if (out->opts->dump_opts.max_depth <= depth) {
@@ -918,14 +918,14 @@ oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok) {
918
918
 
919
919
  if (NULL != f) {
920
920
  f(obj, depth, out, as_ok);
921
- if (Yes == out->opts->trace) {
921
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
922
922
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
923
923
  }
924
924
  return;
925
925
  }
926
926
  }
927
927
  oj_dump_nil(Qnil, depth, out, false);
928
- if (Yes == out->opts->trace) {
928
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
929
929
  oj_trace("dump", Qnil, __FILE__, __LINE__, depth, TraceOut);
930
930
  }
931
931
  }
data/ext/oj/dump_object.c CHANGED
@@ -682,7 +682,7 @@ static DumpFunc obj_funcs[] = {
682
682
  void oj_dump_obj_val(VALUE obj, int depth, Out out) {
683
683
  int type = rb_type(obj);
684
684
 
685
- if (Yes == out->opts->trace) {
685
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
686
686
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
687
687
  }
688
688
  if (MAX_DEPTH < depth) {
@@ -693,14 +693,14 @@ void oj_dump_obj_val(VALUE obj, int depth, Out out) {
693
693
 
694
694
  if (NULL != f) {
695
695
  f(obj, depth, out, false);
696
- if (Yes == out->opts->trace) {
696
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
697
697
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
698
698
  }
699
699
  return;
700
700
  }
701
701
  }
702
702
  oj_dump_nil(Qnil, depth, out, false);
703
- if (Yes == out->opts->trace) {
703
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
704
704
  oj_trace("dump", Qnil, __FILE__, __LINE__, depth, TraceOut);
705
705
  }
706
706
  }
data/ext/oj/dump_strict.c CHANGED
@@ -338,7 +338,7 @@ static DumpFunc strict_funcs[] = {
338
338
  void oj_dump_strict_val(VALUE obj, int depth, Out out) {
339
339
  int type = rb_type(obj);
340
340
 
341
- if (Yes == out->opts->trace) {
341
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
342
342
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
343
343
  }
344
344
  if (MAX_DEPTH < depth) {
@@ -349,7 +349,7 @@ void oj_dump_strict_val(VALUE obj, int depth, Out out) {
349
349
 
350
350
  if (NULL != f) {
351
351
  f(obj, depth, out, false);
352
- if (Yes == out->opts->trace) {
352
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
353
353
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
354
354
  }
355
355
  return;
@@ -386,7 +386,7 @@ static DumpFunc null_funcs[] = {
386
386
  void oj_dump_null_val(VALUE obj, int depth, Out out) {
387
387
  int type = rb_type(obj);
388
388
 
389
- if (Yes == out->opts->trace) {
389
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
390
390
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
391
391
  }
392
392
  if (MAX_DEPTH < depth) {
@@ -397,14 +397,14 @@ void oj_dump_null_val(VALUE obj, int depth, Out out) {
397
397
 
398
398
  if (NULL != f) {
399
399
  f(obj, depth, out, false);
400
- if (Yes == out->opts->trace) {
400
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
401
401
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
402
402
  }
403
403
  return;
404
404
  }
405
405
  }
406
406
  oj_dump_nil(Qnil, depth, out, false);
407
- if (Yes == out->opts->trace) {
407
+ if (RB_UNLIKELY(Yes == out->opts->trace)) {
408
408
  oj_trace("dump", Qnil, __FILE__, __LINE__, depth, TraceOut);
409
409
  }
410
410
  }
data/ext/oj/extconf.rb CHANGED
@@ -34,9 +34,21 @@ have_func('rb_hash_bulk_insert', 'ruby.h') unless '2' == version[0] && '6' == ve
34
34
 
35
35
  dflags['OJ_DEBUG'] = true unless ENV['OJ_DEBUG'].nil?
36
36
 
37
- if try_cflags('-msse4.2')
37
+ src =<<~SRC
38
+ #include <string.h>
39
+ #include <nmmintrin.h>
40
+ int main(int argc, char **argv) {
41
+ const char *str = "hello ";
42
+ const char chars[16] = "\x00\\\"";
43
+ const __m128i terminate = _mm_loadu_si128((const __m128i *)&chars[0]);
44
+ const __m128i string = _mm_loadu_si128((const __m128i *)str);
45
+ int r = _mm_cmpestri(terminate, 3, string, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT);
46
+ return r == 16 ? 0 : 1;
47
+ }
48
+ SRC
49
+
50
+ if try_run(src, '-msse4.2')
38
51
  $CPPFLAGS += ' -msse4.2'
39
- dflags['OJ_USE_SSE4_2'] = 1
40
52
  end
41
53
 
42
54
  dflags.each do |k,v|
data/ext/oj/object.c CHANGED
@@ -445,7 +445,7 @@ WHICH_TYPE:
445
445
  rb_class2name(rb_obj_class(parent->val)));
446
446
  return;
447
447
  }
448
- if (Yes == pi->options.trace) {
448
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
449
449
  oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rval);
450
450
  }
451
451
  }
@@ -516,7 +516,7 @@ WHICH_TYPE:
516
516
  rb_class2name(rb_obj_class(parent->val)));
517
517
  return;
518
518
  }
519
- if (Yes == pi->options.trace) {
519
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
520
520
  oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, rval);
521
521
  }
522
522
  }
@@ -602,13 +602,13 @@ WHICH_TYPE:
602
602
  rb_class2name(rb_obj_class(parent->val)));
603
603
  return;
604
604
  }
605
- if (Yes == pi->options.trace) {
605
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
606
606
  oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, value);
607
607
  }
608
608
  }
609
609
 
610
610
  static VALUE start_hash(ParseInfo pi) {
611
- if (Yes == pi->options.trace) {
611
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
612
612
  oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
613
613
  }
614
614
  return Qnil;
@@ -626,7 +626,7 @@ static void end_hash(ParseInfo pi) {
626
626
  oj_odd_free(oa);
627
627
  parent->odd_args = NULL;
628
628
  }
629
- if (Yes == pi->options.trace) {
629
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
630
630
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
631
631
  }
632
632
  }
@@ -654,7 +654,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
654
654
  }
655
655
  rval = str_to_value(pi, str, len, orig);
656
656
  rb_ary_push(stack_peek(&pi->stack)->val, rval);
657
- if (Yes == pi->options.trace) {
657
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
658
658
  oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rval);
659
659
  }
660
660
  }
@@ -663,21 +663,21 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
663
663
  volatile VALUE rval = oj_num_as_value(ni);
664
664
 
665
665
  rb_ary_push(stack_peek(&pi->stack)->val, rval);
666
- if (Yes == pi->options.trace) {
666
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
667
667
  oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
668
668
  }
669
669
  }
670
670
 
671
671
  static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
672
672
  pi->stack.head->val = str_to_value(pi, str, len, orig);
673
- if (Yes == pi->options.trace) {
673
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
674
674
  oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, pi->stack.head->val);
675
675
  }
676
676
  }
677
677
 
678
678
  static void add_num(ParseInfo pi, NumInfo ni) {
679
679
  pi->stack.head->val = oj_num_as_value(ni);
680
- if (Yes == pi->options.trace) {
680
+ if (RB_UNLIKELY(Yes == pi->options.trace)) {
681
681
  oj_trace_parse_call("add_num", pi, __FILE__, __LINE__, pi->stack.head->val);
682
682
  }
683
683
  }
data/ext/oj/oj.c CHANGED
@@ -2043,4 +2043,5 @@ void Init_oj(void) {
2043
2043
  oj_init_doc();
2044
2044
 
2045
2045
  oj_parser_init();
2046
+ oj_scanner_init();
2046
2047
  }