@@ -1450,20 +1450,20 @@ case 16:
1450
1450
}
1451
1451
}
1452
1452
1453
- static inline VALUE build_string (const char * buffer , const char * bufferStart , bool intern , bool symbolize )
1453
+ static inline VALUE build_string (const char * start , const char * end , bool intern , bool symbolize )
1454
1454
{
1455
1455
if (symbolize ) {
1456
1456
intern = true;
1457
1457
}
1458
1458
VALUE result ;
1459
1459
# ifdef HAVE_RB_ENC_INTERNED_STR
1460
1460
if (intern ) {
1461
- result = rb_enc_interned_str (bufferStart , (long )(buffer - bufferStart ), rb_utf8_encoding ());
1461
+ result = rb_enc_interned_str (start , (long )(end - start ), rb_utf8_encoding ());
1462
1462
} else {
1463
- result = rb_utf8_str_new (bufferStart , (long )(buffer - bufferStart ));
1463
+ result = rb_utf8_str_new (start , (long )(end - start ));
1464
1464
}
1465
1465
# else
1466
- result = rb_utf8_str_new (bufferStart , (long )(buffer - bufferStart ));
1466
+ result = rb_utf8_str_new (start , (long )(end - start ));
1467
1467
if (intern ) {
1468
1468
# if STR_UMINUS_DEDUPE_FROZEN
1469
1469
// Starting from MRI 3.0 it is preferable to freeze the string
@@ -1488,14 +1488,19 @@ static inline VALUE build_string(const char *buffer, const char *bufferStart, bo
1488
1488
}
1489
1489
1490
1490
static const size_t MAX_STACK_BUFFER_SIZE = 128 ;
1491
- static VALUE json_string_unescape (char * string , char * stringEnd , int intern , int symbolize )
1491
+ static VALUE json_string_unescape (char * string , char * stringEnd , bool intern , bool symbolize )
1492
1492
{
1493
1493
VALUE result = Qnil ;
1494
1494
size_t bufferSize = stringEnd - string ;
1495
1495
char * p = string , * pe = string , * unescape , * bufferStart , * buffer ;
1496
1496
int unescape_len ;
1497
1497
char buf [4 ];
1498
1498
1499
+ pe = memchr (p , '\\' , bufferSize );
1500
+ if (RB_LIKELY (pe == NULL )) {
1501
+ return build_string (string , stringEnd , intern , symbolize );
1502
+ }
1503
+
1499
1504
if (bufferSize > MAX_STACK_BUFFER_SIZE ) {
1500
1505
# ifdef HAVE_RB_ENC_INTERNED_STR
1501
1506
bufferStart = buffer = ALLOC_N (char , bufferSize ? bufferSize : 1 );
@@ -1598,7 +1603,7 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int
1598
1603
buffer += pe - p ;
1599
1604
}
1600
1605
1601
- result = build_string (buffer , bufferStart , intern , symbolize );
1606
+ result = build_string (bufferStart , buffer , intern , symbolize );
1602
1607
1603
1608
if (bufferSize > MAX_STACK_BUFFER_SIZE ) {
1604
1609
ruby_xfree (bufferStart );
@@ -1608,15 +1613,15 @@ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int
1608
1613
}
1609
1614
1610
1615
1611
- #line 1612 "parser.c"
1616
+ #line 1617 "parser.c"
1612
1617
enum {JSON_string_start = 1 };
1613
1618
enum {JSON_string_first_final = 8 };
1614
1619
enum {JSON_string_error = 0 };
1615
1620
1616
1621
enum {JSON_string_en_main = 1 };
1617
1622
1618
1623
1619
- #line 640 "parser.rl"
1624
+ #line 645 "parser.rl"
1620
1625
1621
1626
1622
1627
static int
@@ -1637,15 +1642,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
1637
1642
VALUE match_string ;
1638
1643
1639
1644
1640
- #line 1641 "parser.c"
1645
+ #line 1646 "parser.c"
1641
1646
{
1642
1647
cs = JSON_string_start ;
1643
1648
}
1644
1649
1645
- #line 660 "parser.rl"
1650
+ #line 665 "parser.rl"
1646
1651
json -> memo = p ;
1647
1652
1648
- #line 1649 "parser.c"
1653
+ #line 1654 "parser.c"
1649
1654
{
1650
1655
if ( p == pe )
1651
1656
goto _test_eof ;
@@ -1670,7 +1675,7 @@ case 2:
1670
1675
goto st0 ;
1671
1676
goto st2 ;
1672
1677
tr2 :
1673
- #line 627 "parser.rl"
1678
+ #line 632 "parser.rl"
1674
1679
{
1675
1680
* result = json_string_unescape (json -> memo + 1 , p , json -> parsing_name || json -> freeze , json -> parsing_name && json -> symbolize_names );
1676
1681
if (NIL_P (* result )) {
@@ -1680,14 +1685,14 @@ case 2:
1680
1685
{p = (( p + 1 ))- 1 ;}
1681
1686
}
1682
1687
}
1683
- #line 637 "parser.rl"
1688
+ #line 642 "parser.rl"
1684
1689
{ p -- ; {p ++ ; cs = 8 ; goto _out ;} }
1685
1690
goto st8 ;
1686
1691
st8 :
1687
1692
if ( ++ p == pe )
1688
1693
goto _test_eof8 ;
1689
1694
case 8 :
1690
- #line 1691 "parser.c"
1695
+ #line 1696 "parser.c"
1691
1696
goto st0 ;
1692
1697
st3 :
1693
1698
if ( ++ p == pe )
@@ -1763,7 +1768,7 @@ case 7:
1763
1768
_out : {}
1764
1769
}
1765
1770
1766
- #line 662 "parser.rl"
1771
+ #line 667 "parser.rl"
1767
1772
1768
1773
if (json -> create_additions && RTEST (match_string = json -> match_string )) {
1769
1774
VALUE klass ;
@@ -1960,15 +1965,15 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1960
1965
}
1961
1966
1962
1967
1963
- #line 1964 "parser.c"
1968
+ #line 1969 "parser.c"
1964
1969
enum {JSON_start = 1 };
1965
1970
enum {JSON_first_final = 10 };
1966
1971
enum {JSON_error = 0 };
1967
1972
1968
1973
enum {JSON_en_main = 1 };
1969
1974
1970
1975
1971
- #line 872 "parser.rl"
1976
+ #line 877 "parser.rl"
1972
1977
1973
1978
1974
1979
/*
@@ -1986,16 +1991,16 @@ static VALUE cParser_parse(VALUE self)
1986
1991
GET_PARSER ;
1987
1992
1988
1993
1989
- #line 1990 "parser.c"
1994
+ #line 1995 "parser.c"
1990
1995
{
1991
1996
cs = JSON_start ;
1992
1997
}
1993
1998
1994
- #line 889 "parser.rl"
1999
+ #line 894 "parser.rl"
1995
2000
p = json -> source ;
1996
2001
pe = p + json -> len ;
1997
2002
1998
- #line 1999 "parser.c"
2003
+ #line 2004 "parser.c"
1999
2004
{
2000
2005
if ( p == pe )
2001
2006
goto _test_eof ;
@@ -2029,7 +2034,7 @@ case 1:
2029
2034
cs = 0 ;
2030
2035
goto _out ;
2031
2036
tr2 :
2032
- #line 864 "parser.rl"
2037
+ #line 869 "parser.rl"
2033
2038
{
2034
2039
char * np = JSON_parse_value (json , p , pe , & result , 0 );
2035
2040
if (np == NULL ) { p -- ; {p ++ ; cs = 10 ; goto _out ;} } else {p = (( np ))- 1 ;}
@@ -2039,7 +2044,7 @@ cs = 0;
2039
2044
if ( ++ p == pe )
2040
2045
goto _test_eof10 ;
2041
2046
case 10 :
2042
- #line 2043 "parser.c"
2047
+ #line 2048 "parser.c"
2043
2048
switch ( (* p ) ) {
2044
2049
case 13 : goto st10 ;
2045
2050
case 32 : goto st10 ;
@@ -2128,7 +2133,7 @@ case 9:
2128
2133
_out : {}
2129
2134
}
2130
2135
2131
- #line 892 "parser.rl"
2136
+ #line 897 "parser.rl"
2132
2137
2133
2138
if (cs >= JSON_first_final && p == pe ) {
2134
2139
return result ;
0 commit comments