@@ -86,11 +86,11 @@ encoder_dealloc(PyObject *self);
86
86
static int
87
87
encoder_clear (PyEncoderObject * self );
88
88
static int
89
- encoder_listencode_list (PyEncoderObject * s , _PyUnicodeWriter * writer , PyObject * seq , PyObject * newline_indent );
89
+ encoder_listencode_list (PyEncoderObject * s , PyUnicodeWriter * writer , PyObject * seq , PyObject * newline_indent );
90
90
static int
91
- encoder_listencode_obj (PyEncoderObject * s , _PyUnicodeWriter * writer , PyObject * obj , PyObject * newline_indent );
91
+ encoder_listencode_obj (PyEncoderObject * s , PyUnicodeWriter * writer , PyObject * obj , PyObject * newline_indent );
92
92
static int
93
- encoder_listencode_dict (PyEncoderObject * s , _PyUnicodeWriter * writer , PyObject * dct , PyObject * newline_indent );
93
+ encoder_listencode_dict (PyEncoderObject * s , PyUnicodeWriter * writer , PyObject * dct , PyObject * newline_indent );
94
94
static PyObject *
95
95
_encoded_const (PyObject * obj );
96
96
static void
@@ -1268,38 +1268,39 @@ encoder_call(PyEncoderObject *self, PyObject *args, PyObject *kwds)
1268
1268
{
1269
1269
/* Python callable interface to encode_listencode_obj */
1270
1270
static char * kwlist [] = {"obj" , "_current_indent_level" , NULL };
1271
- PyObject * obj , * result ;
1271
+ PyObject * obj ;
1272
1272
Py_ssize_t indent_level ;
1273
- _PyUnicodeWriter writer ;
1274
1273
1275
1274
if (!PyArg_ParseTupleAndKeywords (args , kwds , "On:_iterencode" , kwlist ,
1276
- & obj , & indent_level ))
1275
+ & obj , & indent_level ))
1277
1276
return NULL ;
1278
1277
1279
- _PyUnicodeWriter_Init (& writer );
1280
- writer .overallocate = 1 ;
1278
+ PyUnicodeWriter * writer = PyUnicodeWriter_Create (0 );
1279
+ if (writer == NULL ) {
1280
+ return NULL ;
1281
+ }
1281
1282
1282
1283
PyObject * newline_indent = NULL ;
1283
1284
if (self -> indent != Py_None ) {
1284
1285
newline_indent = _create_newline_indent (self -> indent , indent_level );
1285
1286
if (newline_indent == NULL ) {
1286
- _PyUnicodeWriter_Dealloc ( & writer );
1287
+ PyUnicodeWriter_Discard ( writer );
1287
1288
return NULL ;
1288
1289
}
1289
1290
}
1290
- if (encoder_listencode_obj (self , & writer , obj , newline_indent )) {
1291
- _PyUnicodeWriter_Dealloc ( & writer );
1291
+ if (encoder_listencode_obj (self , writer , obj , newline_indent )) {
1292
+ PyUnicodeWriter_Discard ( writer );
1292
1293
Py_XDECREF (newline_indent );
1293
1294
return NULL ;
1294
1295
}
1295
1296
Py_XDECREF (newline_indent );
1296
1297
1297
- result = PyTuple_New (1 );
1298
- if (result == NULL ||
1299
- PyTuple_SetItem (result , 0 , _PyUnicodeWriter_Finish (& writer )) < 0 ) {
1300
- Py_XDECREF (result );
1298
+ PyObject * str = PyUnicodeWriter_Finish (writer );
1299
+ if (str == NULL ) {
1301
1300
return NULL ;
1302
1301
}
1302
+ PyObject * result = PyTuple_Pack (1 , str );
1303
+ Py_DECREF (str );
1303
1304
return result ;
1304
1305
}
1305
1306
@@ -1370,30 +1371,30 @@ encoder_encode_string(PyEncoderObject *s, PyObject *obj)
1370
1371
}
1371
1372
1372
1373
static int
1373
- _steal_accumulate (_PyUnicodeWriter * writer , PyObject * stolen )
1374
+ _steal_accumulate (PyUnicodeWriter * writer , PyObject * stolen )
1374
1375
{
1375
1376
/* Append stolen and then decrement its reference count */
1376
- int rval = _PyUnicodeWriter_WriteStr (writer , stolen );
1377
+ int rval = PyUnicodeWriter_WriteStr (writer , stolen );
1377
1378
Py_DECREF (stolen );
1378
1379
return rval ;
1379
1380
}
1380
1381
1381
1382
static int
1382
- encoder_listencode_obj (PyEncoderObject * s , _PyUnicodeWriter * writer ,
1383
+ encoder_listencode_obj (PyEncoderObject * s , PyUnicodeWriter * writer ,
1383
1384
PyObject * obj , PyObject * newline_indent )
1384
1385
{
1385
1386
/* Encode Python object obj to a JSON term */
1386
1387
PyObject * newobj ;
1387
1388
int rv ;
1388
1389
1389
1390
if (obj == Py_None ) {
1390
- return _PyUnicodeWriter_WriteASCIIString (writer , "null" , 4 );
1391
+ return PyUnicodeWriter_WriteUTF8 (writer , "null" , 4 );
1391
1392
}
1392
1393
else if (obj == Py_True ) {
1393
- return _PyUnicodeWriter_WriteASCIIString (writer , "true" , 4 );
1394
+ return PyUnicodeWriter_WriteUTF8 (writer , "true" , 4 );
1394
1395
}
1395
1396
else if (obj == Py_False ) {
1396
- return _PyUnicodeWriter_WriteASCIIString (writer , "false" , 5 );
1397
+ return PyUnicodeWriter_WriteUTF8 (writer , "false" , 5 );
1397
1398
}
1398
1399
else if (PyUnicode_Check (obj )) {
1399
1400
PyObject * encoded = encoder_encode_string (s , obj );
@@ -1402,6 +1403,10 @@ encoder_listencode_obj(PyEncoderObject *s, _PyUnicodeWriter *writer,
1402
1403
return _steal_accumulate (writer , encoded );
1403
1404
}
1404
1405
else if (PyLong_Check (obj )) {
1406
+ if (PyLong_CheckExact (obj )) {
1407
+ // Fast-path for exact integers
1408
+ return PyUnicodeWriter_WriteRepr (writer , obj );
1409
+ }
1405
1410
PyObject * encoded = PyLong_Type .tp_repr (obj );
1406
1411
if (encoded == NULL )
1407
1412
return -1 ;
@@ -1478,7 +1483,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyUnicodeWriter *writer,
1478
1483
}
1479
1484
1480
1485
static int
1481
- encoder_encode_key_value (PyEncoderObject * s , _PyUnicodeWriter * writer , bool * first ,
1486
+ encoder_encode_key_value (PyEncoderObject * s , PyUnicodeWriter * writer , bool * first ,
1482
1487
PyObject * dct , PyObject * key , PyObject * value ,
1483
1488
PyObject * newline_indent ,
1484
1489
PyObject * item_separator )
@@ -1518,7 +1523,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
1518
1523
* first = false;
1519
1524
}
1520
1525
else {
1521
- if (_PyUnicodeWriter_WriteStr (writer , item_separator ) < 0 ) {
1526
+ if (PyUnicodeWriter_WriteStr (writer , item_separator ) < 0 ) {
1522
1527
Py_DECREF (keystr );
1523
1528
return -1 ;
1524
1529
}
@@ -1533,7 +1538,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
1533
1538
if (_steal_accumulate (writer , encoded ) < 0 ) {
1534
1539
return -1 ;
1535
1540
}
1536
- if (_PyUnicodeWriter_WriteStr (writer , s -> key_separator ) < 0 ) {
1541
+ if (PyUnicodeWriter_WriteStr (writer , s -> key_separator ) < 0 ) {
1537
1542
return -1 ;
1538
1543
}
1539
1544
if (encoder_listencode_obj (s , writer , value , newline_indent ) < 0 ) {
@@ -1544,7 +1549,7 @@ encoder_encode_key_value(PyEncoderObject *s, _PyUnicodeWriter *writer, bool *fir
1544
1549
}
1545
1550
1546
1551
static int
1547
- encoder_listencode_dict (PyEncoderObject * s , _PyUnicodeWriter * writer ,
1552
+ encoder_listencode_dict (PyEncoderObject * s , PyUnicodeWriter * writer ,
1548
1553
PyObject * dct , PyObject * newline_indent )
1549
1554
{
1550
1555
/* Encode Python dict dct a JSON term */
@@ -1555,8 +1560,10 @@ encoder_listencode_dict(PyEncoderObject *s, _PyUnicodeWriter *writer,
1555
1560
PyObject * new_newline_indent = NULL ;
1556
1561
PyObject * separator_indent = NULL ;
1557
1562
1558
- if (PyDict_GET_SIZE (dct ) == 0 ) /* Fast path */
1559
- return _PyUnicodeWriter_WriteASCIIString (writer , "{}" , 2 );
1563
+ if (PyDict_GET_SIZE (dct ) == 0 ) {
1564
+ /* Fast path */
1565
+ return PyUnicodeWriter_WriteUTF8 (writer , "{}" , 2 );
1566
+ }
1560
1567
1561
1568
if (s -> markers != Py_None ) {
1562
1569
int has_key ;
@@ -1574,8 +1581,9 @@ encoder_listencode_dict(PyEncoderObject *s, _PyUnicodeWriter *writer,
1574
1581
}
1575
1582
}
1576
1583
1577
- if (_PyUnicodeWriter_WriteChar (writer , '{' ))
1584
+ if (PyUnicodeWriter_WriteChar (writer , '{' )) {
1578
1585
goto bail ;
1586
+ }
1579
1587
1580
1588
PyObject * current_item_separator = s -> item_separator ; // borrowed reference
1581
1589
if (s -> indent != Py_None ) {
@@ -1589,7 +1597,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyUnicodeWriter *writer,
1589
1597
}
1590
1598
// update item separator with a borrowed reference
1591
1599
current_item_separator = separator_indent ;
1592
- if (_PyUnicodeWriter_WriteStr (writer , new_newline_indent ) < 0 ) {
1600
+ if (PyUnicodeWriter_WriteStr (writer , new_newline_indent ) < 0 ) {
1593
1601
goto bail ;
1594
1602
}
1595
1603
}
@@ -1635,13 +1643,14 @@ encoder_listencode_dict(PyEncoderObject *s, _PyUnicodeWriter *writer,
1635
1643
Py_CLEAR (new_newline_indent );
1636
1644
Py_CLEAR (separator_indent );
1637
1645
1638
- if (_PyUnicodeWriter_WriteStr (writer , newline_indent ) < 0 ) {
1646
+ if (PyUnicodeWriter_WriteStr (writer , newline_indent ) < 0 ) {
1639
1647
goto bail ;
1640
1648
}
1641
1649
}
1642
1650
1643
- if (_PyUnicodeWriter_WriteChar (writer , '}' ))
1651
+ if (PyUnicodeWriter_WriteChar (writer , '}' )) {
1644
1652
goto bail ;
1653
+ }
1645
1654
return 0 ;
1646
1655
1647
1656
bail :
@@ -1653,7 +1662,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyUnicodeWriter *writer,
1653
1662
}
1654
1663
1655
1664
static int
1656
- encoder_listencode_list (PyEncoderObject * s , _PyUnicodeWriter * writer ,
1665
+ encoder_listencode_list (PyEncoderObject * s , PyUnicodeWriter * writer ,
1657
1666
PyObject * seq , PyObject * newline_indent )
1658
1667
{
1659
1668
PyObject * ident = NULL ;
@@ -1668,7 +1677,7 @@ encoder_listencode_list(PyEncoderObject *s, _PyUnicodeWriter *writer,
1668
1677
return -1 ;
1669
1678
if (PySequence_Fast_GET_SIZE (s_fast ) == 0 ) {
1670
1679
Py_DECREF (s_fast );
1671
- return _PyUnicodeWriter_WriteASCIIString (writer , "[]" , 2 );
1680
+ return PyUnicodeWriter_WriteUTF8 (writer , "[]" , 2 );
1672
1681
}
1673
1682
1674
1683
if (s -> markers != Py_None ) {
@@ -1687,8 +1696,9 @@ encoder_listencode_list(PyEncoderObject *s, _PyUnicodeWriter *writer,
1687
1696
}
1688
1697
}
1689
1698
1690
- if (_PyUnicodeWriter_WriteChar (writer , '[' ))
1699
+ if (PyUnicodeWriter_WriteChar (writer , '[' )) {
1691
1700
goto bail ;
1701
+ }
1692
1702
1693
1703
PyObject * separator = s -> item_separator ; // borrowed reference
1694
1704
if (s -> indent != Py_None ) {
@@ -1697,7 +1707,7 @@ encoder_listencode_list(PyEncoderObject *s, _PyUnicodeWriter *writer,
1697
1707
goto bail ;
1698
1708
}
1699
1709
1700
- if (_PyUnicodeWriter_WriteStr (writer , new_newline_indent ) < 0 ) {
1710
+ if (PyUnicodeWriter_WriteStr (writer , new_newline_indent ) < 0 ) {
1701
1711
goto bail ;
1702
1712
}
1703
1713
@@ -1710,7 +1720,7 @@ encoder_listencode_list(PyEncoderObject *s, _PyUnicodeWriter *writer,
1710
1720
for (i = 0 ; i < PySequence_Fast_GET_SIZE (s_fast ); i ++ ) {
1711
1721
PyObject * obj = PySequence_Fast_GET_ITEM (s_fast , i );
1712
1722
if (i ) {
1713
- if (_PyUnicodeWriter_WriteStr (writer , separator ) < 0 )
1723
+ if (PyUnicodeWriter_WriteStr (writer , separator ) < 0 )
1714
1724
goto bail ;
1715
1725
}
1716
1726
if (encoder_listencode_obj (s , writer , obj , new_newline_indent )) {
@@ -1727,13 +1737,14 @@ encoder_listencode_list(PyEncoderObject *s, _PyUnicodeWriter *writer,
1727
1737
if (s -> indent != Py_None ) {
1728
1738
Py_CLEAR (new_newline_indent );
1729
1739
Py_CLEAR (separator_indent );
1730
- if (_PyUnicodeWriter_WriteStr (writer , newline_indent ) < 0 ) {
1740
+ if (PyUnicodeWriter_WriteStr (writer , newline_indent ) < 0 ) {
1731
1741
goto bail ;
1732
1742
}
1733
1743
}
1734
1744
1735
- if (_PyUnicodeWriter_WriteChar (writer , ']' ))
1745
+ if (PyUnicodeWriter_WriteChar (writer , ']' )) {
1736
1746
goto bail ;
1747
+ }
1737
1748
Py_DECREF (s_fast );
1738
1749
return 0 ;
1739
1750
0 commit comments