@@ -1476,10 +1476,8 @@ static inline VALUE build_string(const char *start, const char *end, bool intern
1476
1476
return result ;
1477
1477
}
1478
1478
1479
- static const size_t MAX_STACK_BUFFER_SIZE = 128 ;
1480
1479
static VALUE json_string_unescape (char * string , char * stringEnd , bool intern , bool symbolize )
1481
1480
{
1482
- VALUE result = Qnil ;
1483
1481
size_t bufferSize = stringEnd - string ;
1484
1482
char * p = string , * pe = string , * unescape , * bufferStart , * buffer ;
1485
1483
int unescape_len ;
@@ -1490,19 +1488,9 @@ static VALUE json_string_unescape(char *string, char *stringEnd, bool intern, bo
1490
1488
return build_string (string , stringEnd , intern , symbolize );
1491
1489
}
1492
1490
1493
- if (bufferSize > MAX_STACK_BUFFER_SIZE ) {
1494
- # ifdef HAVE_RB_ENC_INTERNED_STR
1495
- bufferStart = buffer = ALLOC_N (char , bufferSize ? bufferSize : 1 );
1496
- # else
1497
- bufferStart = buffer = ALLOC_N (char , bufferSize );
1498
- # endif
1499
- } else {
1500
- # ifdef HAVE_RB_ENC_INTERNED_STR
1501
- bufferStart = buffer = ALLOCA_N (char , bufferSize ? bufferSize : 1 );
1502
- # else
1503
- bufferStart = buffer = ALLOCA_N (char , bufferSize );
1504
- # endif
1505
- }
1491
+ VALUE result = rb_str_buf_new (bufferSize );
1492
+ rb_enc_associate_index (result , utf8_encindex );
1493
+ buffer = bufferStart = RSTRING_PTR (result );
1506
1494
1507
1495
while (pe < stringEnd ) {
1508
1496
if (* pe == '\\' ) {
@@ -1536,9 +1524,6 @@ static VALUE json_string_unescape(char *string, char *stringEnd, bool intern, bo
1536
1524
break ;
1537
1525
case 'u' :
1538
1526
if (pe > stringEnd - 4 ) {
1539
- if (bufferSize > MAX_STACK_BUFFER_SIZE ) {
1540
- ruby_xfree (bufferStart );
1541
- }
1542
1527
raise_parse_error ("incomplete unicode character escape sequence at '%s'" , p );
1543
1528
} else {
1544
1529
uint32_t ch = unescape_unicode ((unsigned char * ) ++ pe );
@@ -1556,9 +1541,6 @@ static VALUE json_string_unescape(char *string, char *stringEnd, bool intern, bo
1556
1541
if ((ch & 0xFC00 ) == 0xD800 ) {
1557
1542
pe ++ ;
1558
1543
if (pe > stringEnd - 6 ) {
1559
- if (bufferSize > MAX_STACK_BUFFER_SIZE ) {
1560
- ruby_xfree (bufferStart );
1561
- }
1562
1544
raise_parse_error ("incomplete surrogate pair at '%s'" , p );
1563
1545
}
1564
1546
if (pe [0 ] == '\\' && pe [1 ] == 'u' ) {
@@ -1591,26 +1573,27 @@ static VALUE json_string_unescape(char *string, char *stringEnd, bool intern, bo
1591
1573
MEMCPY (buffer , p , char , pe - p );
1592
1574
buffer += pe - p ;
1593
1575
}
1576
+ rb_str_set_len (result , buffer - bufferStart );
1594
1577
1595
- result = build_string ( bufferStart , buffer , intern , symbolize );
1596
-
1597
- if ( bufferSize > MAX_STACK_BUFFER_SIZE ) {
1598
- ruby_xfree ( bufferStart );
1578
+ if ( symbolize ) {
1579
+ result = rb_str_intern ( result );
1580
+ } else if ( intern ) {
1581
+ result = rb_funcall ( rb_str_freeze ( result ), i_uminus , 0 );
1599
1582
}
1600
1583
1601
1584
return result ;
1602
1585
}
1603
1586
1604
1587
1605
- #line 1606 "parser.c"
1588
+ #line 1589 "parser.c"
1606
1589
enum {JSON_string_start = 1 };
1607
1590
enum {JSON_string_first_final = 8 };
1608
1591
enum {JSON_string_error = 0 };
1609
1592
1610
1593
enum {JSON_string_en_main = 1 };
1611
1594
1612
1595
1613
- #line 634 "parser.rl"
1596
+ #line 617 "parser.rl"
1614
1597
1615
1598
1616
1599
static int
@@ -1631,15 +1614,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
1631
1614
VALUE match_string ;
1632
1615
1633
1616
1634
- #line 1635 "parser.c"
1617
+ #line 1618 "parser.c"
1635
1618
{
1636
1619
cs = JSON_string_start ;
1637
1620
}
1638
1621
1639
- #line 654 "parser.rl"
1622
+ #line 637 "parser.rl"
1640
1623
json -> memo = p ;
1641
1624
1642
- #line 1643 "parser.c"
1625
+ #line 1626 "parser.c"
1643
1626
{
1644
1627
if ( p == pe )
1645
1628
goto _test_eof ;
@@ -1664,7 +1647,7 @@ case 2:
1664
1647
goto st0 ;
1665
1648
goto st2 ;
1666
1649
tr2 :
1667
- #line 621 "parser.rl"
1650
+ #line 604 "parser.rl"
1668
1651
{
1669
1652
* result = json_string_unescape (json -> memo + 1 , p , json -> parsing_name || json -> freeze , json -> parsing_name && json -> symbolize_names );
1670
1653
if (NIL_P (* result )) {
@@ -1674,14 +1657,14 @@ case 2:
1674
1657
{p = (( p + 1 ))- 1 ;}
1675
1658
}
1676
1659
}
1677
- #line 631 "parser.rl"
1660
+ #line 614 "parser.rl"
1678
1661
{ p -- ; {p ++ ; cs = 8 ; goto _out ;} }
1679
1662
goto st8 ;
1680
1663
st8 :
1681
1664
if ( ++ p == pe )
1682
1665
goto _test_eof8 ;
1683
1666
case 8 :
1684
- #line 1685 "parser.c"
1667
+ #line 1668 "parser.c"
1685
1668
goto st0 ;
1686
1669
st3 :
1687
1670
if ( ++ p == pe )
@@ -1757,7 +1740,7 @@ case 7:
1757
1740
_out : {}
1758
1741
}
1759
1742
1760
- #line 656 "parser.rl"
1743
+ #line 639 "parser.rl"
1761
1744
1762
1745
if (json -> create_additions && RTEST (match_string = json -> match_string )) {
1763
1746
VALUE klass ;
@@ -1954,15 +1937,15 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1954
1937
}
1955
1938
1956
1939
1957
- #line 1958 "parser.c"
1940
+ #line 1941 "parser.c"
1958
1941
enum {JSON_start = 1 };
1959
1942
enum {JSON_first_final = 10 };
1960
1943
enum {JSON_error = 0 };
1961
1944
1962
1945
enum {JSON_en_main = 1 };
1963
1946
1964
1947
1965
- #line 866 "parser.rl"
1948
+ #line 849 "parser.rl"
1966
1949
1967
1950
1968
1951
/*
@@ -1980,16 +1963,16 @@ static VALUE cParser_parse(VALUE self)
1980
1963
GET_PARSER ;
1981
1964
1982
1965
1983
- #line 1984 "parser.c"
1966
+ #line 1967 "parser.c"
1984
1967
{
1985
1968
cs = JSON_start ;
1986
1969
}
1987
1970
1988
- #line 883 "parser.rl"
1971
+ #line 866 "parser.rl"
1989
1972
p = json -> source ;
1990
1973
pe = p + json -> len ;
1991
1974
1992
- #line 1993 "parser.c"
1975
+ #line 1976 "parser.c"
1993
1976
{
1994
1977
if ( p == pe )
1995
1978
goto _test_eof ;
@@ -2023,7 +2006,7 @@ case 1:
2023
2006
cs = 0 ;
2024
2007
goto _out ;
2025
2008
tr2 :
2026
- #line 858 "parser.rl"
2009
+ #line 841 "parser.rl"
2027
2010
{
2028
2011
char * np = JSON_parse_value (json , p , pe , & result , 0 );
2029
2012
if (np == NULL ) { p -- ; {p ++ ; cs = 10 ; goto _out ;} } else {p = (( np ))- 1 ;}
@@ -2033,7 +2016,7 @@ cs = 0;
2033
2016
if ( ++ p == pe )
2034
2017
goto _test_eof10 ;
2035
2018
case 10 :
2036
- #line 2037 "parser.c"
2019
+ #line 2020 "parser.c"
2037
2020
switch ( (* p ) ) {
2038
2021
case 13 : goto st10 ;
2039
2022
case 32 : goto st10 ;
@@ -2122,7 +2105,7 @@ case 9:
2122
2105
_out : {}
2123
2106
}
2124
2107
2125
- #line 886 "parser.rl"
2108
+ #line 869 "parser.rl"
2126
2109
2127
2110
if (cs >= JSON_first_final && p == pe ) {
2128
2111
return result ;
0 commit comments