json 2.8.1 → 2.8.2

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: 39c161c94f7ae85545dc117ec7616aa65f69e9192f081dd1d0934fc57f7a1b9b
4
- data.tar.gz: f980984efc78b2bf8b0aa81e67dc8115e503bcb03171ce7658bdc9ba653da0b7
3
+ metadata.gz: 61a5759c78160e412505a53cc6579e3259689fe69adbd74d5e4aefb21b7ef64c
4
+ data.tar.gz: 072f37b6964a498df827e85e2038e4692c8452d5365a6c8794536508b1a95e9d
5
5
  SHA512:
6
- metadata.gz: 02e0733a4e893e0c486bc3ea2785c15601c5e660d990c8c83543df3df6f93acdb41d29e656f951896de8854f9672d89bae462f7761746e27614e038b48f72296
7
- data.tar.gz: 5b22f7e7aa15e8965293fb91ac5d45631f5ef16dbaf0911f5d0763175138dfde8bb104dcea2df73c5e99fda45aecde081c971ccd2bc7c2dae9b4d700376ef8e3
6
+ metadata.gz: e65781ec7eb7ab0c5b48b12eaf8e988fd5632874d60c6c35450ba934c586ceb47b622adb5b6f2652dcd7a1641dedbb0a674d1b458839d45944c862671d74d33f
7
+ data.tar.gz: 19b1ccd3cdf1126ac3825993a3c4aa06eff96b5ab80e0391ee3a150c4dd164d53052fa89aea0aeabd53e1bfbf4f513fc5276471c7eff1231e38f1ad89f1df1d7
data/CHANGES.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changes
2
2
 
3
+ ### 2024-11-14 (2.8.2)
4
+
5
+ * `JSON.load_file` explictly read the file as UTF-8.
6
+
3
7
  ### 2024-11-06 (2.8.1)
4
8
 
5
9
  * Fix the java packages to include the extension.
@@ -394,6 +394,7 @@ typedef struct JSON_ParserStruct {
394
394
  VALUE decimal_class;
395
395
  VALUE match_string;
396
396
  FBuffer fbuffer;
397
+ int in_array;
397
398
  int max_nesting;
398
399
  bool allow_nan;
399
400
  bool allow_trailing_comma;
@@ -422,8 +423,7 @@ static const rb_data_type_t JSON_Parser_type;
422
423
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
423
424
  static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
424
425
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
425
- static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
426
- static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
426
+ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result);
427
427
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
428
428
 
429
429
 
@@ -1077,7 +1077,7 @@ enum {JSON_value_error = 0};
1077
1077
  enum {JSON_value_en_main = 1};
1078
1078
 
1079
1079
 
1080
- #line 666 "parser.rl"
1080
+ #line 664 "parser.rl"
1081
1081
 
1082
1082
 
1083
1083
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -1090,7 +1090,7 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
1090
1090
  cs = JSON_value_start;
1091
1091
  }
1092
1092
 
1093
- #line 673 "parser.rl"
1093
+ #line 671 "parser.rl"
1094
1094
 
1095
1095
  #line 1096 "parser.c"
1096
1096
  {
@@ -1150,11 +1150,7 @@ tr3:
1150
1150
  raise_parse_error("unexpected token at '%s'", p);
1151
1151
  }
1152
1152
  }
1153
- np = JSON_parse_float(json, p, pe, result);
1154
- if (np != NULL) {
1155
- {p = (( np))-1;}
1156
- }
1157
- np = JSON_parse_integer(json, p, pe, result);
1153
+ np = JSON_parse_number(json, p, pe, result);
1158
1154
  if (np != NULL) {
1159
1155
  {p = (( np))-1;}
1160
1156
  }
@@ -1162,15 +1158,17 @@ tr3:
1162
1158
  }
1163
1159
  goto st29;
1164
1160
  tr7:
1165
- #line 641 "parser.rl"
1161
+ #line 637 "parser.rl"
1166
1162
  {
1167
1163
  char *np;
1164
+ json->in_array++;
1168
1165
  np = JSON_parse_array(json, p, pe, result, current_nesting + 1);
1166
+ json->in_array--;
1169
1167
  if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
1170
1168
  }
1171
1169
  goto st29;
1172
1170
  tr11:
1173
- #line 647 "parser.rl"
1171
+ #line 645 "parser.rl"
1174
1172
  {
1175
1173
  char *np;
1176
1174
  np = JSON_parse_object(json, p, pe, result, current_nesting + 1);
@@ -1219,9 +1217,9 @@ st29:
1219
1217
  if ( ++p == pe )
1220
1218
  goto _test_eof29;
1221
1219
  case 29:
1222
- #line 653 "parser.rl"
1220
+ #line 651 "parser.rl"
1223
1221
  { p--; {p++; cs = 29; goto _out;} }
1224
- #line 1225 "parser.c"
1222
+ #line 1223 "parser.c"
1225
1223
  switch( (*p) ) {
1226
1224
  case 13: goto st29;
1227
1225
  case 32: goto st29;
@@ -1462,7 +1460,7 @@ case 28:
1462
1460
  _out: {}
1463
1461
  }
1464
1462
 
1465
- #line 674 "parser.rl"
1463
+ #line 672 "parser.rl"
1466
1464
 
1467
1465
  if (json->freeze) {
1468
1466
  OBJ_FREEZE(*result);
@@ -1477,7 +1475,7 @@ case 28:
1477
1475
  }
1478
1476
 
1479
1477
 
1480
- #line 1481 "parser.c"
1478
+ #line 1479 "parser.c"
1481
1479
  enum {JSON_integer_start = 1};
1482
1480
  enum {JSON_integer_first_final = 3};
1483
1481
  enum {JSON_integer_error = 0};
@@ -1485,7 +1483,7 @@ enum {JSON_integer_error = 0};
1485
1483
  enum {JSON_integer_en_main = 1};
1486
1484
 
1487
1485
 
1488
- #line 695 "parser.rl"
1486
+ #line 693 "parser.rl"
1489
1487
 
1490
1488
 
1491
1489
  #define MAX_FAST_INTEGER_SIZE 18
@@ -1510,82 +1508,8 @@ static inline VALUE fast_parse_integer(char *p, char *pe)
1510
1508
  return LL2NUM(memo);
1511
1509
  }
1512
1510
 
1513
- static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
1511
+ static char *JSON_decode_integer(JSON_Parser *json, char *p, VALUE *result)
1514
1512
  {
1515
- int cs = EVIL;
1516
-
1517
-
1518
- #line 1519 "parser.c"
1519
- {
1520
- cs = JSON_integer_start;
1521
- }
1522
-
1523
- #line 724 "parser.rl"
1524
- json->memo = p;
1525
-
1526
- #line 1527 "parser.c"
1527
- {
1528
- if ( p == pe )
1529
- goto _test_eof;
1530
- switch ( cs )
1531
- {
1532
- case 1:
1533
- switch( (*p) ) {
1534
- case 45: goto st2;
1535
- case 48: goto st3;
1536
- }
1537
- if ( 49 <= (*p) && (*p) <= 57 )
1538
- goto st5;
1539
- goto st0;
1540
- st0:
1541
- cs = 0;
1542
- goto _out;
1543
- st2:
1544
- if ( ++p == pe )
1545
- goto _test_eof2;
1546
- case 2:
1547
- if ( (*p) == 48 )
1548
- goto st3;
1549
- if ( 49 <= (*p) && (*p) <= 57 )
1550
- goto st5;
1551
- goto st0;
1552
- st3:
1553
- if ( ++p == pe )
1554
- goto _test_eof3;
1555
- case 3:
1556
- if ( 48 <= (*p) && (*p) <= 57 )
1557
- goto st0;
1558
- goto tr4;
1559
- tr4:
1560
- #line 692 "parser.rl"
1561
- { p--; {p++; cs = 4; goto _out;} }
1562
- goto st4;
1563
- st4:
1564
- if ( ++p == pe )
1565
- goto _test_eof4;
1566
- case 4:
1567
- #line 1568 "parser.c"
1568
- goto st0;
1569
- st5:
1570
- if ( ++p == pe )
1571
- goto _test_eof5;
1572
- case 5:
1573
- if ( 48 <= (*p) && (*p) <= 57 )
1574
- goto st5;
1575
- goto tr4;
1576
- }
1577
- _test_eof2: cs = 2; goto _test_eof;
1578
- _test_eof3: cs = 3; goto _test_eof;
1579
- _test_eof4: cs = 4; goto _test_eof;
1580
- _test_eof5: cs = 5; goto _test_eof;
1581
-
1582
- _test_eof: {}
1583
- _out: {}
1584
- }
1585
-
1586
- #line 726 "parser.rl"
1587
-
1588
- if (cs >= JSON_integer_first_final) {
1589
1513
  long len = p - json->memo;
1590
1514
  if (RB_LIKELY(len < MAX_FAST_INTEGER_SIZE)) {
1591
1515
  *result = fast_parse_integer(json->memo, p);
@@ -1596,37 +1520,35 @@ case 5:
1596
1520
  *result = rb_cstr2inum(FBUFFER_PTR(&json->fbuffer), 10);
1597
1521
  }
1598
1522
  return p + 1;
1599
- } else {
1600
- return NULL;
1601
- }
1602
1523
  }
1603
1524
 
1604
1525
 
1605
- #line 1606 "parser.c"
1526
+ #line 1527 "parser.c"
1606
1527
  enum {JSON_float_start = 1};
1607
- enum {JSON_float_first_final = 8};
1528
+ enum {JSON_float_first_final = 6};
1608
1529
  enum {JSON_float_error = 0};
1609
1530
 
1610
1531
  enum {JSON_float_en_main = 1};
1611
1532
 
1612
1533
 
1613
- #line 755 "parser.rl"
1534
+ #line 745 "parser.rl"
1614
1535
 
1615
1536
 
1616
- static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
1537
+ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result)
1617
1538
  {
1618
1539
  int cs = EVIL;
1540
+ bool is_float = false;
1619
1541
 
1620
1542
 
1621
- #line 1622 "parser.c"
1543
+ #line 1544 "parser.c"
1622
1544
  {
1623
1545
  cs = JSON_float_start;
1624
1546
  }
1625
1547
 
1626
- #line 762 "parser.rl"
1548
+ #line 753 "parser.rl"
1627
1549
  json->memo = p;
1628
1550
 
1629
- #line 1630 "parser.c"
1551
+ #line 1552 "parser.c"
1630
1552
  {
1631
1553
  if ( p == pe )
1632
1554
  goto _test_eof;
@@ -1635,10 +1557,10 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
1635
1557
  case 1:
1636
1558
  switch( (*p) ) {
1637
1559
  case 45: goto st2;
1638
- case 48: goto st3;
1560
+ case 48: goto st6;
1639
1561
  }
1640
1562
  if ( 49 <= (*p) && (*p) <= 57 )
1641
- goto st7;
1563
+ goto st10;
1642
1564
  goto st0;
1643
1565
  st0:
1644
1566
  cs = 0;
@@ -1648,24 +1570,42 @@ st2:
1648
1570
  goto _test_eof2;
1649
1571
  case 2:
1650
1572
  if ( (*p) == 48 )
1651
- goto st3;
1573
+ goto st6;
1652
1574
  if ( 49 <= (*p) && (*p) <= 57 )
1653
- goto st7;
1575
+ goto st10;
1654
1576
  goto st0;
1655
- st3:
1577
+ st6:
1656
1578
  if ( ++p == pe )
1657
- goto _test_eof3;
1658
- case 3:
1579
+ goto _test_eof6;
1580
+ case 6:
1659
1581
  switch( (*p) ) {
1660
- case 46: goto st4;
1661
- case 69: goto st5;
1662
- case 101: goto st5;
1582
+ case 45: goto st0;
1583
+ case 46: goto tr8;
1584
+ case 69: goto tr9;
1585
+ case 101: goto tr9;
1663
1586
  }
1587
+ if ( 48 <= (*p) && (*p) <= 57 )
1588
+ goto st0;
1589
+ goto tr7;
1590
+ tr7:
1591
+ #line 737 "parser.rl"
1592
+ { p--; {p++; cs = 7; goto _out;} }
1593
+ goto st7;
1594
+ st7:
1595
+ if ( ++p == pe )
1596
+ goto _test_eof7;
1597
+ case 7:
1598
+ #line 1599 "parser.c"
1664
1599
  goto st0;
1665
- st4:
1600
+ tr8:
1601
+ #line 738 "parser.rl"
1602
+ { is_float = true; }
1603
+ goto st3;
1604
+ st3:
1666
1605
  if ( ++p == pe )
1667
- goto _test_eof4;
1668
- case 4:
1606
+ goto _test_eof3;
1607
+ case 3:
1608
+ #line 1609 "parser.c"
1669
1609
  if ( 48 <= (*p) && (*p) <= 57 )
1670
1610
  goto st8;
1671
1611
  goto st0;
@@ -1674,87 +1614,86 @@ st8:
1674
1614
  goto _test_eof8;
1675
1615
  case 8:
1676
1616
  switch( (*p) ) {
1677
- case 69: goto st5;
1678
- case 101: goto st5;
1617
+ case 69: goto st4;
1618
+ case 101: goto st4;
1679
1619
  }
1680
1620
  if ( (*p) > 46 ) {
1681
1621
  if ( 48 <= (*p) && (*p) <= 57 )
1682
1622
  goto st8;
1683
1623
  } else if ( (*p) >= 45 )
1684
1624
  goto st0;
1685
- goto tr9;
1625
+ goto tr7;
1686
1626
  tr9:
1687
- #line 749 "parser.rl"
1688
- { p--; {p++; cs = 9; goto _out;} }
1689
- goto st9;
1690
- st9:
1691
- if ( ++p == pe )
1692
- goto _test_eof9;
1693
- case 9:
1694
- #line 1695 "parser.c"
1695
- goto st0;
1696
- st5:
1627
+ #line 738 "parser.rl"
1628
+ { is_float = true; }
1629
+ goto st4;
1630
+ st4:
1697
1631
  if ( ++p == pe )
1698
- goto _test_eof5;
1699
- case 5:
1632
+ goto _test_eof4;
1633
+ case 4:
1634
+ #line 1635 "parser.c"
1700
1635
  switch( (*p) ) {
1701
- case 43: goto st6;
1702
- case 45: goto st6;
1636
+ case 43: goto st5;
1637
+ case 45: goto st5;
1703
1638
  }
1704
1639
  if ( 48 <= (*p) && (*p) <= 57 )
1705
- goto st10;
1640
+ goto st9;
1706
1641
  goto st0;
1707
- st6:
1642
+ st5:
1708
1643
  if ( ++p == pe )
1709
- goto _test_eof6;
1710
- case 6:
1644
+ goto _test_eof5;
1645
+ case 5:
1711
1646
  if ( 48 <= (*p) && (*p) <= 57 )
1712
- goto st10;
1647
+ goto st9;
1713
1648
  goto st0;
1714
- st10:
1649
+ st9:
1715
1650
  if ( ++p == pe )
1716
- goto _test_eof10;
1717
- case 10:
1651
+ goto _test_eof9;
1652
+ case 9:
1718
1653
  switch( (*p) ) {
1719
1654
  case 69: goto st0;
1720
1655
  case 101: goto st0;
1721
1656
  }
1722
1657
  if ( (*p) > 46 ) {
1723
1658
  if ( 48 <= (*p) && (*p) <= 57 )
1724
- goto st10;
1659
+ goto st9;
1725
1660
  } else if ( (*p) >= 45 )
1726
1661
  goto st0;
1727
- goto tr9;
1728
- st7:
1662
+ goto tr7;
1663
+ st10:
1729
1664
  if ( ++p == pe )
1730
- goto _test_eof7;
1731
- case 7:
1665
+ goto _test_eof10;
1666
+ case 10:
1732
1667
  switch( (*p) ) {
1733
- case 46: goto st4;
1734
- case 69: goto st5;
1735
- case 101: goto st5;
1668
+ case 45: goto st0;
1669
+ case 46: goto tr8;
1670
+ case 69: goto tr9;
1671
+ case 101: goto tr9;
1736
1672
  }
1737
1673
  if ( 48 <= (*p) && (*p) <= 57 )
1738
- goto st7;
1739
- goto st0;
1674
+ goto st10;
1675
+ goto tr7;
1740
1676
  }
1741
1677
  _test_eof2: cs = 2; goto _test_eof;
1678
+ _test_eof6: cs = 6; goto _test_eof;
1679
+ _test_eof7: cs = 7; goto _test_eof;
1742
1680
  _test_eof3: cs = 3; goto _test_eof;
1743
- _test_eof4: cs = 4; goto _test_eof;
1744
1681
  _test_eof8: cs = 8; goto _test_eof;
1745
- _test_eof9: cs = 9; goto _test_eof;
1682
+ _test_eof4: cs = 4; goto _test_eof;
1746
1683
  _test_eof5: cs = 5; goto _test_eof;
1747
- _test_eof6: cs = 6; goto _test_eof;
1684
+ _test_eof9: cs = 9; goto _test_eof;
1748
1685
  _test_eof10: cs = 10; goto _test_eof;
1749
- _test_eof7: cs = 7; goto _test_eof;
1750
1686
 
1751
1687
  _test_eof: {}
1752
1688
  _out: {}
1753
1689
  }
1754
1690
 
1755
- #line 764 "parser.rl"
1691
+ #line 755 "parser.rl"
1756
1692
 
1757
1693
  if (cs >= JSON_float_first_final) {
1694
+ if (!is_float) {
1695
+ return JSON_decode_integer(json, p, result);
1696
+ }
1758
1697
  VALUE mod = Qnil;
1759
1698
  ID method_id = 0;
1760
1699
  if (json->decimal_class) {
@@ -1805,7 +1744,7 @@ case 7:
1805
1744
 
1806
1745
 
1807
1746
 
1808
- #line 1809 "parser.c"
1747
+ #line 1748 "parser.c"
1809
1748
  enum {JSON_array_start = 1};
1810
1749
  enum {JSON_array_first_final = 22};
1811
1750
  enum {JSON_array_error = 0};
@@ -1813,7 +1752,7 @@ enum {JSON_array_error = 0};
1813
1752
  enum {JSON_array_en_main = 1};
1814
1753
 
1815
1754
 
1816
- #line 841 "parser.rl"
1755
+ #line 835 "parser.rl"
1817
1756
 
1818
1757
 
1819
1758
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -1826,14 +1765,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
1826
1765
  long stack_head = json->stack->head;
1827
1766
 
1828
1767
 
1829
- #line 1830 "parser.c"
1768
+ #line 1769 "parser.c"
1830
1769
  {
1831
1770
  cs = JSON_array_start;
1832
1771
  }
1833
1772
 
1834
- #line 853 "parser.rl"
1773
+ #line 847 "parser.rl"
1835
1774
 
1836
- #line 1837 "parser.c"
1775
+ #line 1776 "parser.c"
1837
1776
  {
1838
1777
  short _widec;
1839
1778
  if ( p == pe )
@@ -1873,7 +1812,7 @@ case 2:
1873
1812
  goto st2;
1874
1813
  goto st0;
1875
1814
  tr2:
1876
- #line 821 "parser.rl"
1815
+ #line 815 "parser.rl"
1877
1816
  {
1878
1817
  VALUE v = Qnil;
1879
1818
  char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
@@ -1888,12 +1827,12 @@ st3:
1888
1827
  if ( ++p == pe )
1889
1828
  goto _test_eof3;
1890
1829
  case 3:
1891
- #line 1892 "parser.c"
1830
+ #line 1831 "parser.c"
1892
1831
  _widec = (*p);
1893
1832
  if ( 44 <= (*p) && (*p) <= 44 ) {
1894
1833
  _widec = (short)(128 + ((*p) - -128));
1895
1834
  if (
1896
- #line 831 "parser.rl"
1835
+ #line 825 "parser.rl"
1897
1836
  json->allow_trailing_comma ) _widec += 256;
1898
1837
  }
1899
1838
  switch( _widec ) {
@@ -1940,14 +1879,14 @@ case 7:
1940
1879
  goto st3;
1941
1880
  goto st7;
1942
1881
  tr4:
1943
- #line 833 "parser.rl"
1882
+ #line 827 "parser.rl"
1944
1883
  { p--; {p++; cs = 22; goto _out;} }
1945
1884
  goto st22;
1946
1885
  st22:
1947
1886
  if ( ++p == pe )
1948
1887
  goto _test_eof22;
1949
1888
  case 22:
1950
- #line 1951 "parser.c"
1889
+ #line 1890 "parser.c"
1951
1890
  goto st0;
1952
1891
  st8:
1953
1892
  if ( ++p == pe )
@@ -2015,13 +1954,13 @@ case 13:
2015
1954
  if ( 10 <= (*p) && (*p) <= 10 ) {
2016
1955
  _widec = (short)(128 + ((*p) - -128));
2017
1956
  if (
2018
- #line 831 "parser.rl"
1957
+ #line 825 "parser.rl"
2019
1958
  json->allow_trailing_comma ) _widec += 256;
2020
1959
  }
2021
1960
  } else if ( (*p) >= 9 ) {
2022
1961
  _widec = (short)(128 + ((*p) - -128));
2023
1962
  if (
2024
- #line 831 "parser.rl"
1963
+ #line 825 "parser.rl"
2025
1964
  json->allow_trailing_comma ) _widec += 256;
2026
1965
  }
2027
1966
  } else if ( (*p) > 13 ) {
@@ -2029,19 +1968,19 @@ case 13:
2029
1968
  if ( 47 <= (*p) && (*p) <= 47 ) {
2030
1969
  _widec = (short)(128 + ((*p) - -128));
2031
1970
  if (
2032
- #line 831 "parser.rl"
1971
+ #line 825 "parser.rl"
2033
1972
  json->allow_trailing_comma ) _widec += 256;
2034
1973
  }
2035
1974
  } else if ( (*p) >= 32 ) {
2036
1975
  _widec = (short)(128 + ((*p) - -128));
2037
1976
  if (
2038
- #line 831 "parser.rl"
1977
+ #line 825 "parser.rl"
2039
1978
  json->allow_trailing_comma ) _widec += 256;
2040
1979
  }
2041
1980
  } else {
2042
1981
  _widec = (short)(128 + ((*p) - -128));
2043
1982
  if (
2044
- #line 831 "parser.rl"
1983
+ #line 825 "parser.rl"
2045
1984
  json->allow_trailing_comma ) _widec += 256;
2046
1985
  }
2047
1986
  switch( _widec ) {
@@ -2080,13 +2019,13 @@ case 14:
2080
2019
  if ( 47 <= (*p) && (*p) <= 47 ) {
2081
2020
  _widec = (short)(128 + ((*p) - -128));
2082
2021
  if (
2083
- #line 831 "parser.rl"
2022
+ #line 825 "parser.rl"
2084
2023
  json->allow_trailing_comma ) _widec += 256;
2085
2024
  }
2086
2025
  } else if ( (*p) >= 42 ) {
2087
2026
  _widec = (short)(128 + ((*p) - -128));
2088
2027
  if (
2089
- #line 831 "parser.rl"
2028
+ #line 825 "parser.rl"
2090
2029
  json->allow_trailing_comma ) _widec += 256;
2091
2030
  }
2092
2031
  switch( _widec ) {
@@ -2105,20 +2044,20 @@ case 15:
2105
2044
  if ( (*p) <= 41 ) {
2106
2045
  _widec = (short)(128 + ((*p) - -128));
2107
2046
  if (
2108
- #line 831 "parser.rl"
2047
+ #line 825 "parser.rl"
2109
2048
  json->allow_trailing_comma ) _widec += 256;
2110
2049
  }
2111
2050
  } else if ( (*p) > 42 ) {
2112
2051
  if ( 43 <= (*p) )
2113
2052
  { _widec = (short)(128 + ((*p) - -128));
2114
2053
  if (
2115
- #line 831 "parser.rl"
2054
+ #line 825 "parser.rl"
2116
2055
  json->allow_trailing_comma ) _widec += 256;
2117
2056
  }
2118
2057
  } else {
2119
2058
  _widec = (short)(128 + ((*p) - -128));
2120
2059
  if (
2121
- #line 831 "parser.rl"
2060
+ #line 825 "parser.rl"
2122
2061
  json->allow_trailing_comma ) _widec += 256;
2123
2062
  }
2124
2063
  switch( _widec ) {
@@ -2141,13 +2080,13 @@ case 16:
2141
2080
  if ( 42 <= (*p) && (*p) <= 42 ) {
2142
2081
  _widec = (short)(128 + ((*p) - -128));
2143
2082
  if (
2144
- #line 831 "parser.rl"
2083
+ #line 825 "parser.rl"
2145
2084
  json->allow_trailing_comma ) _widec += 256;
2146
2085
  }
2147
2086
  } else {
2148
2087
  _widec = (short)(128 + ((*p) - -128));
2149
2088
  if (
2150
- #line 831 "parser.rl"
2089
+ #line 825 "parser.rl"
2151
2090
  json->allow_trailing_comma ) _widec += 256;
2152
2091
  }
2153
2092
  } else if ( (*p) > 46 ) {
@@ -2155,19 +2094,19 @@ case 16:
2155
2094
  if ( 48 <= (*p) )
2156
2095
  { _widec = (short)(128 + ((*p) - -128));
2157
2096
  if (
2158
- #line 831 "parser.rl"
2097
+ #line 825 "parser.rl"
2159
2098
  json->allow_trailing_comma ) _widec += 256;
2160
2099
  }
2161
2100
  } else if ( (*p) >= 47 ) {
2162
2101
  _widec = (short)(128 + ((*p) - -128));
2163
2102
  if (
2164
- #line 831 "parser.rl"
2103
+ #line 825 "parser.rl"
2165
2104
  json->allow_trailing_comma ) _widec += 256;
2166
2105
  }
2167
2106
  } else {
2168
2107
  _widec = (short)(128 + ((*p) - -128));
2169
2108
  if (
2170
- #line 831 "parser.rl"
2109
+ #line 825 "parser.rl"
2171
2110
  json->allow_trailing_comma ) _widec += 256;
2172
2111
  }
2173
2112
  switch( _widec ) {
@@ -2191,20 +2130,20 @@ case 17:
2191
2130
  if ( (*p) <= 9 ) {
2192
2131
  _widec = (short)(128 + ((*p) - -128));
2193
2132
  if (
2194
- #line 831 "parser.rl"
2133
+ #line 825 "parser.rl"
2195
2134
  json->allow_trailing_comma ) _widec += 256;
2196
2135
  }
2197
2136
  } else if ( (*p) > 10 ) {
2198
2137
  if ( 11 <= (*p) )
2199
2138
  { _widec = (short)(128 + ((*p) - -128));
2200
2139
  if (
2201
- #line 831 "parser.rl"
2140
+ #line 825 "parser.rl"
2202
2141
  json->allow_trailing_comma ) _widec += 256;
2203
2142
  }
2204
2143
  } else {
2205
2144
  _widec = (short)(128 + ((*p) - -128));
2206
2145
  if (
2207
- #line 831 "parser.rl"
2146
+ #line 825 "parser.rl"
2208
2147
  json->allow_trailing_comma ) _widec += 256;
2209
2148
  }
2210
2149
  switch( _widec ) {
@@ -2276,7 +2215,7 @@ case 21:
2276
2215
  _out: {}
2277
2216
  }
2278
2217
 
2279
- #line 854 "parser.rl"
2218
+ #line 848 "parser.rl"
2280
2219
 
2281
2220
  if(cs >= JSON_array_first_final) {
2282
2221
  long count = json->stack->head - stack_head;
@@ -2332,7 +2271,7 @@ static VALUE json_string_fastpath(JSON_Parser *json, char *string, char *stringE
2332
2271
  {
2333
2272
  size_t bufferSize = stringEnd - string;
2334
2273
 
2335
- if (is_name) {
2274
+ if (is_name && json->in_array) {
2336
2275
  VALUE cached_key;
2337
2276
  if (RB_UNLIKELY(symbolize)) {
2338
2277
  cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
@@ -2355,7 +2294,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
2355
2294
  int unescape_len;
2356
2295
  char buf[4];
2357
2296
 
2358
- if (is_name) {
2297
+ if (is_name && json->in_array) {
2359
2298
  VALUE cached_key;
2360
2299
  if (RB_UNLIKELY(symbolize)) {
2361
2300
  cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
@@ -2470,7 +2409,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
2470
2409
  }
2471
2410
 
2472
2411
 
2473
- #line 2474 "parser.c"
2412
+ #line 2413 "parser.c"
2474
2413
  enum {JSON_string_start = 1};
2475
2414
  enum {JSON_string_first_final = 9};
2476
2415
  enum {JSON_string_error = 0};
@@ -2478,7 +2417,7 @@ enum {JSON_string_error = 0};
2478
2417
  enum {JSON_string_en_main = 1};
2479
2418
 
2480
2419
 
2481
- #line 1077 "parser.rl"
2420
+ #line 1071 "parser.rl"
2482
2421
 
2483
2422
 
2484
2423
  static int
@@ -2499,15 +2438,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
2499
2438
  VALUE match_string;
2500
2439
 
2501
2440
 
2502
- #line 2503 "parser.c"
2441
+ #line 2442 "parser.c"
2503
2442
  {
2504
2443
  cs = JSON_string_start;
2505
2444
  }
2506
2445
 
2507
- #line 1097 "parser.rl"
2446
+ #line 1091 "parser.rl"
2508
2447
  json->memo = p;
2509
2448
 
2510
- #line 2511 "parser.c"
2449
+ #line 2450 "parser.c"
2511
2450
  {
2512
2451
  if ( p == pe )
2513
2452
  goto _test_eof;
@@ -2532,14 +2471,14 @@ case 2:
2532
2471
  goto st0;
2533
2472
  goto st2;
2534
2473
  tr2:
2535
- #line 1059 "parser.rl"
2474
+ #line 1053 "parser.rl"
2536
2475
  {
2537
2476
  *result = json_string_fastpath(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2538
2477
  {p = (( p + 1))-1;}
2539
2478
  p--;
2540
2479
  {p++; cs = 9; goto _out;}
2541
2480
  }
2542
- #line 1052 "parser.rl"
2481
+ #line 1046 "parser.rl"
2543
2482
  {
2544
2483
  *result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2545
2484
  {p = (( p + 1))-1;}
@@ -2548,7 +2487,7 @@ tr2:
2548
2487
  }
2549
2488
  goto st9;
2550
2489
  tr6:
2551
- #line 1052 "parser.rl"
2490
+ #line 1046 "parser.rl"
2552
2491
  {
2553
2492
  *result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2554
2493
  {p = (( p + 1))-1;}
@@ -2560,7 +2499,7 @@ st9:
2560
2499
  if ( ++p == pe )
2561
2500
  goto _test_eof9;
2562
2501
  case 9:
2563
- #line 2564 "parser.c"
2502
+ #line 2503 "parser.c"
2564
2503
  goto st0;
2565
2504
  st3:
2566
2505
  if ( ++p == pe )
@@ -2648,7 +2587,7 @@ case 8:
2648
2587
  _out: {}
2649
2588
  }
2650
2589
 
2651
- #line 1099 "parser.rl"
2590
+ #line 1093 "parser.rl"
2652
2591
 
2653
2592
  if (json->create_additions && RTEST(match_string = json->match_string)) {
2654
2593
  VALUE klass;
@@ -2801,7 +2740,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
2801
2740
  }
2802
2741
 
2803
2742
 
2804
- #line 2805 "parser.c"
2743
+ #line 2744 "parser.c"
2805
2744
  enum {JSON_start = 1};
2806
2745
  enum {JSON_first_final = 10};
2807
2746
  enum {JSON_error = 0};
@@ -2809,7 +2748,7 @@ enum {JSON_error = 0};
2809
2748
  enum {JSON_en_main = 1};
2810
2749
 
2811
2750
 
2812
- #line 1265 "parser.rl"
2751
+ #line 1259 "parser.rl"
2813
2752
 
2814
2753
 
2815
2754
  /*
@@ -2838,16 +2777,16 @@ static VALUE cParser_parse(VALUE self)
2838
2777
  json->stack = &stack;
2839
2778
 
2840
2779
 
2841
- #line 2842 "parser.c"
2780
+ #line 2781 "parser.c"
2842
2781
  {
2843
2782
  cs = JSON_start;
2844
2783
  }
2845
2784
 
2846
- #line 1293 "parser.rl"
2785
+ #line 1287 "parser.rl"
2847
2786
  p = json->source;
2848
2787
  pe = p + json->len;
2849
2788
 
2850
- #line 2851 "parser.c"
2789
+ #line 2790 "parser.c"
2851
2790
  {
2852
2791
  if ( p == pe )
2853
2792
  goto _test_eof;
@@ -2881,7 +2820,7 @@ st0:
2881
2820
  cs = 0;
2882
2821
  goto _out;
2883
2822
  tr2:
2884
- #line 1257 "parser.rl"
2823
+ #line 1251 "parser.rl"
2885
2824
  {
2886
2825
  char *np = JSON_parse_value(json, p, pe, &result, 0);
2887
2826
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -2891,7 +2830,7 @@ st10:
2891
2830
  if ( ++p == pe )
2892
2831
  goto _test_eof10;
2893
2832
  case 10:
2894
- #line 2895 "parser.c"
2833
+ #line 2834 "parser.c"
2895
2834
  switch( (*p) ) {
2896
2835
  case 13: goto st10;
2897
2836
  case 32: goto st10;
@@ -2980,7 +2919,7 @@ case 9:
2980
2919
  _out: {}
2981
2920
  }
2982
2921
 
2983
- #line 1296 "parser.rl"
2922
+ #line 1290 "parser.rl"
2984
2923
 
2985
2924
  if (json->stack_handle) {
2986
2925
  rvalue_stack_eagerly_release(json->stack_handle);
@@ -3016,16 +2955,16 @@ static VALUE cParser_m_parse(VALUE klass, VALUE source, VALUE opts)
3016
2955
  json->stack = &stack;
3017
2956
 
3018
2957
 
3019
- #line 3020 "parser.c"
2958
+ #line 2959 "parser.c"
3020
2959
  {
3021
2960
  cs = JSON_start;
3022
2961
  }
3023
2962
 
3024
- #line 1331 "parser.rl"
2963
+ #line 1325 "parser.rl"
3025
2964
  p = json->source;
3026
2965
  pe = p + json->len;
3027
2966
 
3028
- #line 3029 "parser.c"
2967
+ #line 2968 "parser.c"
3029
2968
  {
3030
2969
  if ( p == pe )
3031
2970
  goto _test_eof;
@@ -3059,7 +2998,7 @@ st0:
3059
2998
  cs = 0;
3060
2999
  goto _out;
3061
3000
  tr2:
3062
- #line 1257 "parser.rl"
3001
+ #line 1251 "parser.rl"
3063
3002
  {
3064
3003
  char *np = JSON_parse_value(json, p, pe, &result, 0);
3065
3004
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -3069,7 +3008,7 @@ st10:
3069
3008
  if ( ++p == pe )
3070
3009
  goto _test_eof10;
3071
3010
  case 10:
3072
- #line 3073 "parser.c"
3011
+ #line 3012 "parser.c"
3073
3012
  switch( (*p) ) {
3074
3013
  case 13: goto st10;
3075
3014
  case 32: goto st10;
@@ -3158,7 +3097,7 @@ case 9:
3158
3097
  _out: {}
3159
3098
  }
3160
3099
 
3161
- #line 1334 "parser.rl"
3100
+ #line 1328 "parser.rl"
3162
3101
 
3163
3102
  if (json->stack_handle) {
3164
3103
  rvalue_stack_eagerly_release(json->stack_handle);
@@ -392,6 +392,7 @@ typedef struct JSON_ParserStruct {
392
392
  VALUE decimal_class;
393
393
  VALUE match_string;
394
394
  FBuffer fbuffer;
395
+ int in_array;
395
396
  int max_nesting;
396
397
  bool allow_nan;
397
398
  bool allow_trailing_comma;
@@ -420,8 +421,7 @@ static const rb_data_type_t JSON_Parser_type;
420
421
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
421
422
  static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
422
423
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
423
- static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
424
- static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
424
+ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result);
425
425
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
426
426
 
427
427
 
@@ -627,11 +627,7 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
627
627
  raise_parse_error("unexpected token at '%s'", p);
628
628
  }
629
629
  }
630
- np = JSON_parse_float(json, fpc, pe, result);
631
- if (np != NULL) {
632
- fexec np;
633
- }
634
- np = JSON_parse_integer(json, fpc, pe, result);
630
+ np = JSON_parse_number(json, fpc, pe, result);
635
631
  if (np != NULL) {
636
632
  fexec np;
637
633
  }
@@ -640,7 +636,9 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
640
636
 
641
637
  action parse_array {
642
638
  char *np;
639
+ json->in_array++;
643
640
  np = JSON_parse_array(json, fpc, pe, result, current_nesting + 1);
641
+ json->in_array--;
644
642
  if (np == NULL) { fhold; fbreak; } else fexec np;
645
643
  }
646
644
 
@@ -716,15 +714,8 @@ static inline VALUE fast_parse_integer(char *p, char *pe)
716
714
  return LL2NUM(memo);
717
715
  }
718
716
 
719
- static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
717
+ static char *JSON_decode_integer(JSON_Parser *json, char *p, VALUE *result)
720
718
  {
721
- int cs = EVIL;
722
-
723
- %% write init;
724
- json->memo = p;
725
- %% write exec;
726
-
727
- if (cs >= JSON_integer_first_final) {
728
719
  long len = p - json->memo;
729
720
  if (RB_LIKELY(len < MAX_FAST_INTEGER_SIZE)) {
730
721
  *result = fast_parse_integer(json->memo, p);
@@ -735,9 +726,6 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
735
726
  *result = rb_cstr2inum(FBUFFER_PTR(&json->fbuffer), 10);
736
727
  }
737
728
  return p + 1;
738
- } else {
739
- return NULL;
740
- }
741
729
  }
742
730
 
743
731
  %%{
@@ -747,22 +735,28 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
747
735
  write data;
748
736
 
749
737
  action exit { fhold; fbreak; }
738
+ action isFloat { is_float = true; }
750
739
 
751
740
  main := '-'? (
752
- (('0' | [1-9][0-9]*) '.' [0-9]+ ([Ee] [+\-]?[0-9]+)?)
753
- | (('0' | [1-9][0-9]*) ([Ee] [+\-]?[0-9]+))
754
- ) (^[0-9Ee.\-]? @exit );
741
+ (('0' | [1-9][0-9]*)
742
+ ((('.' [0-9]+ ([Ee] [+\-]?[0-9]+)?) |
743
+ ([Ee] [+\-]?[0-9]+)) > isFloat)?
744
+ ) (^[0-9Ee.\-]? @exit ));
755
745
  }%%
756
746
 
757
- static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
747
+ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result)
758
748
  {
759
749
  int cs = EVIL;
750
+ bool is_float = false;
760
751
 
761
752
  %% write init;
762
753
  json->memo = p;
763
754
  %% write exec;
764
755
 
765
756
  if (cs >= JSON_float_first_final) {
757
+ if (!is_float) {
758
+ return JSON_decode_integer(json, p, result);
759
+ }
766
760
  VALUE mod = Qnil;
767
761
  ID method_id = 0;
768
762
  if (json->decimal_class) {
@@ -906,7 +900,7 @@ static VALUE json_string_fastpath(JSON_Parser *json, char *string, char *stringE
906
900
  {
907
901
  size_t bufferSize = stringEnd - string;
908
902
 
909
- if (is_name) {
903
+ if (is_name && json->in_array) {
910
904
  VALUE cached_key;
911
905
  if (RB_UNLIKELY(symbolize)) {
912
906
  cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
@@ -929,7 +923,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
929
923
  int unescape_len;
930
924
  char buf[4];
931
925
 
932
- if (is_name) {
926
+ if (is_name && json->in_array) {
933
927
  VALUE cached_key;
934
928
  if (RB_UNLIKELY(symbolize)) {
935
929
  cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
data/lib/json/common.rb CHANGED
@@ -1,4 +1,5 @@
1
- #frozen_string_literal: true
1
+ # frozen_string_literal: true
2
+
2
3
  require 'json/version'
3
4
 
4
5
  module JSON
@@ -25,7 +26,7 @@ module JSON
25
26
  elsif object.respond_to?(:to_str)
26
27
  str = object.to_str
27
28
  if str.is_a?(String)
28
- return JSON.parse(object.to_str, opts)
29
+ return JSON.parse(str, opts)
29
30
  end
30
31
  end
31
32
 
@@ -230,8 +231,8 @@ module JSON
230
231
  # parse(File.read(path), opts)
231
232
  #
232
233
  # See method #parse.
233
- def load_file(filespec, opts = {})
234
- parse(File.read(filespec), opts)
234
+ def load_file(filespec, opts = nil)
235
+ parse(File.read(filespec, encoding: Encoding::UTF_8), opts)
235
236
  end
236
237
 
237
238
  # :call-seq:
@@ -242,7 +243,7 @@ module JSON
242
243
  #
243
244
  # See method #parse!
244
245
  def load_file!(filespec, opts = {})
245
- parse!(File.read(filespec), opts)
246
+ parse!(File.read(filespec, encoding: Encoding::UTF_8), opts)
246
247
  end
247
248
 
248
249
  # :call-seq:
data/lib/json/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JSON
4
- VERSION = '2.8.1'
4
+ VERSION = '2.8.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.1
4
+ version: 2.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-06 00:00:00.000000000 Z
11
+ date: 2024-11-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This is a JSON implementation as a Ruby extension in C.
14
14
  email: flori@ping.de