oj 3.16.8 → 3.16.9

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.
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