@@ -257,16 +257,14 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end,
257
257
/* UTF-8 encoder specialized for a Unicode kind to avoid the slow
258
258
PyUnicode_READ() macro. Delete some parts of the code depending on the kind:
259
259
UCS-1 strings don't need to handle surrogates for example. */
260
- Py_LOCAL_INLINE (char * )
261
- STRINGLIB (utf8_encoder )(_PyBytesWriter * writer ,
262
- PyObject * unicode ,
260
+ Py_LOCAL_INLINE (PyBytesWriter * )
261
+ STRINGLIB (utf8_encoder )(PyObject * unicode ,
263
262
const STRINGLIB_CHAR * data ,
264
263
Py_ssize_t size ,
265
264
_Py_error_handler error_handler ,
266
- const char * errors )
265
+ const char * errors ,
266
+ char * * end )
267
267
{
268
- Py_ssize_t i ; /* index into data of next input character */
269
- char * p ; /* next free byte in output buffer */
270
268
#if STRINGLIB_SIZEOF_CHAR > 1
271
269
PyObject * error_handler_obj = NULL ;
272
270
PyObject * exc = NULL ;
@@ -284,14 +282,19 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
284
282
if (size > PY_SSIZE_T_MAX / max_char_size ) {
285
283
/* integer overflow */
286
284
PyErr_NoMemory ();
285
+ * end = NULL ;
287
286
return NULL ;
288
287
}
289
288
290
- _PyBytesWriter_Init ( writer );
291
- p = _PyBytesWriter_Alloc (writer , size * max_char_size );
292
- if ( p == NULL )
289
+ PyBytesWriter * writer = PyBytesWriter_Create ( size * max_char_size );
290
+ if (writer == NULL ) {
291
+ * end = NULL ;
293
292
return NULL ;
293
+ }
294
+ /* next free byte in output buffer */
295
+ char * p = PyBytesWriter_GetData (writer );
294
296
297
+ Py_ssize_t i ; /* index into data of next input character */
295
298
for (i = 0 ; i < size ;) {
296
299
Py_UCS4 ch = data [i ++ ];
297
300
@@ -348,7 +351,7 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
348
351
349
352
case _Py_ERROR_BACKSLASHREPLACE :
350
353
/* subtract preallocated bytes */
351
- writer -> min_size -= max_char_size * (endpos - startpos );
354
+ writer -> size -= max_char_size * (endpos - startpos );
352
355
p = backslashreplace (writer , p ,
353
356
unicode , startpos , endpos );
354
357
if (p == NULL )
@@ -358,7 +361,7 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
358
361
359
362
case _Py_ERROR_XMLCHARREFREPLACE :
360
363
/* subtract preallocated bytes */
361
- writer -> min_size -= max_char_size * (endpos - startpos );
364
+ writer -> size -= max_char_size * (endpos - startpos );
362
365
p = xmlcharrefreplace (writer , p ,
363
366
unicode , startpos , endpos );
364
367
if (p == NULL )
@@ -389,22 +392,25 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
389
392
390
393
if (newpos < startpos ) {
391
394
writer -> overallocate = 1 ;
392
- p = _PyBytesWriter_Prepare (writer , p ,
393
- max_char_size * (startpos - newpos ));
394
- if (p == NULL )
395
+ p = PyBytesWriter_GrowAndUpdatePointer (writer ,
396
+ max_char_size * (startpos - newpos ),
397
+ p );
398
+ if (p == NULL ) {
395
399
goto error ;
400
+ }
396
401
}
397
402
else {
398
403
/* subtract preallocated bytes */
399
- writer -> min_size -= max_char_size * (newpos - startpos );
404
+ writer -> size -= max_char_size * (newpos - startpos );
400
405
/* Only overallocate the buffer if it's not the last write */
401
406
writer -> overallocate = (newpos < size );
402
407
}
403
408
409
+ char * rep_str ;
410
+ Py_ssize_t rep_len ;
404
411
if (PyBytes_Check (rep )) {
405
- p = _PyBytesWriter_WriteBytes (writer , p ,
406
- PyBytes_AS_STRING (rep ),
407
- PyBytes_GET_SIZE (rep ));
412
+ rep_str = PyBytes_AS_STRING (rep );
413
+ rep_len = PyBytes_GET_SIZE (rep );
408
414
}
409
415
else {
410
416
/* rep is unicode */
@@ -415,13 +421,16 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
415
421
goto error ;
416
422
}
417
423
418
- p = _PyBytesWriter_WriteBytes (writer , p ,
419
- PyUnicode_DATA (rep ),
420
- PyUnicode_GET_LENGTH (rep ));
424
+ rep_str = PyUnicode_DATA (rep );
425
+ rep_len = PyUnicode_GET_LENGTH (rep );
421
426
}
422
427
423
- if (p == NULL )
428
+ p = PyBytesWriter_GrowAndUpdatePointer (writer , rep_len , p );
429
+ if (p == NULL ) {
424
430
goto error ;
431
+ }
432
+ memcpy (p , rep_str , rep_len );
433
+ p += rep_len ;
425
434
Py_CLEAR (rep );
426
435
427
436
i = newpos ;
@@ -458,13 +467,16 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer,
458
467
Py_XDECREF (error_handler_obj );
459
468
Py_XDECREF (exc );
460
469
#endif
461
- return p ;
470
+ * end = p ;
471
+ return writer ;
462
472
463
473
#if STRINGLIB_SIZEOF_CHAR > 1
464
474
error :
475
+ PyBytesWriter_Discard (writer );
465
476
Py_XDECREF (rep );
466
477
Py_XDECREF (error_handler_obj );
467
478
Py_XDECREF (exc );
479
+ * end = NULL ;
468
480
return NULL ;
469
481
#endif
470
482
}
0 commit comments