@@ -7141,41 +7141,34 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
71417141PyObject *
71427142PyUnicode_AsRawUnicodeEscapeString (PyObject * unicode )
71437143{
7144- PyObject * repr ;
7145- char * p ;
7146- Py_ssize_t expandsize , pos ;
7147- int kind ;
7148- const void * data ;
7149- Py_ssize_t len ;
7150-
71517144 if (!PyUnicode_Check (unicode )) {
71527145 PyErr_BadArgument ();
71537146 return NULL ;
71547147 }
7155- kind = PyUnicode_KIND (unicode );
7156- data = PyUnicode_DATA (unicode );
7157- len = PyUnicode_GET_LENGTH (unicode );
7148+ int kind = PyUnicode_KIND (unicode );
7149+ const void * data = PyUnicode_DATA (unicode );
7150+ Py_ssize_t len = PyUnicode_GET_LENGTH (unicode );
7151+ if (len == 0 ) {
7152+ return Py_GetConstant (Py_CONSTANT_EMPTY_BYTES );
7153+ }
71587154 if (kind == PyUnicode_1BYTE_KIND ) {
71597155 return PyBytes_FromStringAndSize (data , len );
71607156 }
71617157
71627158 /* 4 byte characters can take up 10 bytes, 2 byte characters can take up 6
71637159 bytes, and 1 byte characters 4. */
7164- expandsize = kind * 2 + 2 ;
7165-
7160+ Py_ssize_t expandsize = kind * 2 + 2 ;
71667161 if (len > PY_SSIZE_T_MAX / expandsize ) {
71677162 return PyErr_NoMemory ();
71687163 }
7169- repr = PyBytes_FromStringAndSize (NULL , expandsize * len );
7170- if (repr == NULL ) {
7164+
7165+ PyBytesWriter * writer = PyBytesWriter_Create (expandsize * len );
7166+ if (writer == NULL ) {
71717167 return NULL ;
71727168 }
7173- if (len == 0 ) {
7174- return repr ;
7175- }
7169+ char * p = PyBytesWriter_GetData (writer );
71767170
7177- p = PyBytes_AS_STRING (repr );
7178- for (pos = 0 ; pos < len ; pos ++ ) {
7171+ for (Py_ssize_t pos = 0 ; pos < len ; pos ++ ) {
71797172 Py_UCS4 ch = PyUnicode_READ (kind , data , pos );
71807173
71817174 /* U+0000-U+00ff range: Copy 8-bit characters as-is */
@@ -7207,11 +7200,7 @@ PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
72077200 }
72087201 }
72097202
7210- assert (p > PyBytes_AS_STRING (repr ));
7211- if (_PyBytes_Resize (& repr , p - PyBytes_AS_STRING (repr )) < 0 ) {
7212- return NULL ;
7213- }
7214- return repr ;
7203+ return PyBytesWriter_FinishWithPointer (writer , p );
72157204}
72167205
72177206/* --- Latin-1 Codec ------------------------------------------------------ */
0 commit comments