@@ -202,55 +202,50 @@ _codecs_escape_encode_impl(PyObject *module, PyObject *data,
202202                           const  char  * errors )
203203/*[clinic end generated code: output=4af1d477834bab34 input=8f4b144799a94245]*/ 
204204{
205-     Py_ssize_t  size ;
206-     Py_ssize_t  newsize ;
207-     PyObject  * v ;
208- 
209-     size  =  PyBytes_GET_SIZE (data );
205+     Py_ssize_t  size  =  PyBytes_GET_SIZE (data );
210206    if  (size  >  PY_SSIZE_T_MAX  / 4 ) {
211207        PyErr_SetString (PyExc_OverflowError ,
212208            "string is too large to encode" );
213209            return  NULL ;
214210    }
215-     newsize  =  4 * size ;
216-     v  =  PyBytes_FromStringAndSize (NULL , newsize );
211+     Py_ssize_t  newsize  =  4 * size ;
217212
218-     if  (v  ==  NULL ) {
213+     PyBytesWriter  * writer  =  PyBytesWriter_Create (newsize );
214+     if  (writer  ==  NULL ) {
219215        return  NULL ;
220216    }
221-     else  {
222-         Py_ssize_t  i ;
223-         char  c ;
224-         char  * p  =  PyBytes_AS_STRING (v );
225- 
226-         for  (i  =  0 ; i  <  size ; i ++ ) {
227-             /* There's at least enough room for a hex escape */ 
228-             assert (newsize  -  (p  -  PyBytes_AS_STRING (v )) >= 4 );
229-             c  =  PyBytes_AS_STRING (data )[i ];
230-             if  (c  ==  '\''  ||  c  ==  '\\' )
231-                 * p ++  =  '\\' , * p ++  =  c ;
232-             else  if  (c  ==  '\t' )
233-                 * p ++  =  '\\' , * p ++  =  't' ;
234-             else  if  (c  ==  '\n' )
235-                 * p ++  =  '\\' , * p ++  =  'n' ;
236-             else  if  (c  ==  '\r' )
237-                 * p ++  =  '\\' , * p ++  =  'r' ;
238-             else  if  (c  <  ' '  ||  c  >= 0x7f ) {
239-                 * p ++  =  '\\' ;
240-                 * p ++  =  'x' ;
241-                 * p ++  =  Py_hexdigits [(c  &  0xf0 ) >> 4 ];
242-                 * p ++  =  Py_hexdigits [c  &  0xf ];
243-             }
244-             else 
245-                 * p ++  =  c ;
217+     char  * p  =  PyBytesWriter_GetData (writer );
218+ 
219+     for  (Py_ssize_t  i  =  0 ; i  <  size ; i ++ ) {
220+         /* There's at least enough room for a hex escape */ 
221+         assert (newsize  -  (p  -  (char * )PyBytesWriter_GetData (writer )) >= 4 );
222+ 
223+         char  c  =  PyBytes_AS_STRING (data )[i ];
224+         if  (c  ==  '\''  ||  c  ==  '\\' ) {
225+             * p ++  =  '\\' ; * p ++  =  c ;
246226        }
247-         * p  =  '\0' ;
248-         if  (_PyBytes_Resize (& v , (p  -  PyBytes_AS_STRING (v )))) {
249-             return  NULL ;
227+         else  if  (c  ==  '\t' ) {
228+             * p ++  =  '\\' ; * p ++  =  't' ;
229+         }
230+         else  if  (c  ==  '\n' ) {
231+             * p ++  =  '\\' ; * p ++  =  'n' ;
232+         }
233+         else  if  (c  ==  '\r' ) {
234+             * p ++  =  '\\' ; * p ++  =  'r' ;
235+         }
236+         else  if  (c  <  ' '  ||  c  >= 0x7f ) {
237+             * p ++  =  '\\' ;
238+             * p ++  =  'x' ;
239+             * p ++  =  Py_hexdigits [(c  &  0xf0 ) >> 4 ];
240+             * p ++  =  Py_hexdigits [c  &  0xf ];
241+         }
242+         else  {
243+             * p ++  =  c ;
250244        }
251245    }
252246
253-     return  codec_tuple (v , size );
247+     PyObject  * decoded  =  PyBytesWriter_FinishWithPointer (writer , p );
248+     return  codec_tuple (decoded , size );
254249}
255250
256251/* --- Decoder ------------------------------------------------------------ */ 
0 commit comments