oj 3.16.8 → 3.16.9

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: dd892ffebade1cd09db195de3776e8243b6cff9da4cb75ab57bc80c7b41d7adc
4
- data.tar.gz: ba7345e84005d76de67001c6d42dd7be457b8ca62c35fd3f03ea90779d818d3f
3
+ metadata.gz: d3e57c02a1fe6782596953f34b8e2a2b729a09b5d8e7128dd4633d430ca7aa0c
4
+ data.tar.gz: 7698f8c0203459d62f4421f11a9c3637b04b5b808ecf87ce4ca057e2fd073762
5
5
  SHA512:
6
- metadata.gz: 6bd02aae21bc2ccb6855a86ee68f3810caa76df4db695fb1d400e7c200813e4ed8f8244c88545ca16f8bf8c39063d5f38ac6f76afafdf655939868a683b66cb3
7
- data.tar.gz: 939ffdbf9336eda7e261c8acbab50a55b868be7c3574daaa9520deae51e5bcf615759265cd0ad54886f7faf49634c31db7ae7523e18edb3c0632f43fc199841f
6
+ metadata.gz: 417ada5b645a6ba48e81b52bb72cec97bb4a64595a61252989346a975c1026b3cbc039cbf7cef166b5dbfbdd79554d5c9e5786da3299ce1fd3f2ec70d3ef479f
7
+ data.tar.gz: ceffb29c6732b107d42091bc8754e8b4174e26e6d8eb9c4162ed8a12a65d37aa2450f9f5398d39242d92fabd46d63be5fc14e0dc003774378e4e6211b02e3f0d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.16.9 - 2024-12-28
4
+
5
+ - Fixed `Oj::Parser` create_id size issue #931.
6
+
7
+ - Changed parser to be more optimized (PR from @Watson1978)
8
+
3
9
  ## 3.16.8 - 2024-12-14
4
10
 
5
11
  - Fixed StreamWriter to write to non-file IO thanks to @jscheid.
data/ext/oj/parse.c CHANGED
@@ -681,7 +681,7 @@ void oj_parse2(ParseInfo pi) {
681
681
  pi->cur = pi->json;
682
682
  err_init(&pi->err);
683
683
  while (1) {
684
- if (0 < pi->max_depth && pi->max_depth <= pi->stack.tail - pi->stack.head - 1) {
684
+ if (RB_UNLIKELY(0 < pi->max_depth && pi->max_depth <= pi->stack.tail - pi->stack.head - 1)) {
685
685
  VALUE err_clas = oj_get_json_err_class("NestingError");
686
686
 
687
687
  oj_set_error_at(pi, err_clas, __FILE__, __LINE__, "Too deeply nested.");
@@ -689,18 +689,20 @@ void oj_parse2(ParseInfo pi) {
689
689
  return;
690
690
  }
691
691
  next_non_white(pi);
692
- if (!first && '\0' != *pi->cur) {
693
- oj_set_error_at(pi,
694
- oj_parse_error_class,
695
- __FILE__,
696
- __LINE__,
697
- "unexpected characters after the JSON document");
698
- }
699
-
700
- // If no tokens are consumed (i.e. empty string), throw a parse error
701
- // this is the behavior of JSON.parse in both Ruby and JS.
702
- if (No == pi->options.empty_string && 1 == first && '\0' == *pi->cur) {
703
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character");
692
+ if (first) {
693
+ // If no tokens are consumed (i.e. empty string), throw a parse error
694
+ // this is the behavior of JSON.parse in both Ruby and JS.
695
+ if (RB_UNLIKELY('\0' == *pi->cur && No == pi->options.empty_string)) {
696
+ oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character");
697
+ }
698
+ } else {
699
+ if (RB_UNLIKELY('\0' != *pi->cur)) {
700
+ oj_set_error_at(pi,
701
+ oj_parse_error_class,
702
+ __FILE__,
703
+ __LINE__,
704
+ "unexpected characters after the JSON document");
705
+ }
704
706
  }
705
707
 
706
708
  switch (*pi->cur++) {
@@ -761,7 +763,7 @@ void oj_parse2(ParseInfo pi) {
761
763
  case '\0': pi->cur--; return;
762
764
  default: oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character"); return;
763
765
  }
764
- if (err_has(&pi->err)) {
766
+ if (RB_UNLIKELY(err_has(&pi->err))) {
765
767
  return;
766
768
  }
767
769
  if (stack_empty(&pi->stack)) {
data/ext/oj/usual.c CHANGED
@@ -834,8 +834,8 @@ static VALUE opt_create_id_set(ojParser p, VALUE value) {
834
834
  rb_check_type(value, T_STRING);
835
835
  size_t len = RSTRING_LEN(value);
836
836
 
837
- if (1 << sizeof(d->create_id_len) <= len) {
838
- rb_raise(rb_eArgError, "The create_id values is limited to %d bytes.", 1 << sizeof(d->create_id_len));
837
+ if (1 << (8 * sizeof(d->create_id_len)) <= len) {
838
+ rb_raise(rb_eArgError, "The create_id values is limited to %d bytes.", 1 << (8 * sizeof(d->create_id_len)));
839
839
  }
840
840
  d->create_id_len = (uint8_t)len;
841
841
  d->create_id = str_dup(RSTRING_PTR(value), len);
data/lib/oj/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Oj
2
2
  # Current version of the module.
3
- VERSION = '3.16.8'
3
+ VERSION = '3.16.9'
4
4
  end
@@ -217,6 +217,10 @@ class UsualTest < Minitest::Test
217
217
 
218
218
  doc = p.parse('{"a":true,"^":"UsualTest::MyClass","b":false}')
219
219
  assert_equal('UsualTest::MyClass{a: true b: false}', doc.to_s)
220
+
221
+ p.create_id = 'class'
222
+ doc = p.parse('{"a":true,"class":"UsualTest::MyClass","b":false}')
223
+ assert_equal('UsualTest::MyClass{a: true b: false}', doc.to_s)
220
224
  end
221
225
 
222
226
  def test_missing_class
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.16.8
4
+ version: 3.16.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-14 00:00:00.000000000 Z
11
+ date: 2024-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal