Add _PyBytesWriter_WriteBytes() to factorize the code

This commit is contained in:
Victor Stinner 2015-10-09 12:57:22 +02:00
parent ad7715891e
commit ce179bf6ba
4 changed files with 35 additions and 16 deletions

View File

@ -174,6 +174,13 @@ PyAPI_FUNC(char*) _PyBytesWriter_Alloc(_PyBytesWriter *writer,
PyAPI_FUNC(char*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, PyAPI_FUNC(char*) _PyBytesWriter_Prepare(_PyBytesWriter *writer,
char *str, char *str,
Py_ssize_t size); Py_ssize_t size);
/* Write bytes.
Raise an exception and return NULL on error. */
PyAPI_FUNC(char*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer,
char *str,
char *bytes,
Py_ssize_t size);
#endif /* Py_LIMITED_API */ #endif /* Py_LIMITED_API */
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -3995,3 +3995,17 @@ _PyBytesWriter_Finish(_PyBytesWriter *writer, char *str)
return result; return result;
} }
char*
_PyBytesWriter_WriteBytes(_PyBytesWriter *writer, char *str,
char *bytes, Py_ssize_t size)
{
str = _PyBytesWriter_Prepare(writer, str, size);
if (str == NULL)
return NULL;
Py_MEMCPY(str, bytes, size);
str += size;
return str;
}

View File

@ -388,24 +388,24 @@ STRINGLIB(utf8_encoder)(PyObject *unicode,
/* substract preallocated bytes */ /* substract preallocated bytes */
writer.min_size -= max_char_size; writer.min_size -= max_char_size;
if (PyBytes_Check(rep)) if (PyBytes_Check(rep)) {
repsize = PyBytes_GET_SIZE(rep); p = _PyBytesWriter_WriteBytes(&writer, p,
else PyBytes_AS_STRING(rep),
repsize = PyUnicode_GET_LENGTH(rep); PyBytes_GET_SIZE(rep));
p = _PyBytesWriter_Prepare(&writer, p, repsize);
if (p == NULL) if (p == NULL)
goto error; goto error;
if (PyBytes_Check(rep)) {
memcpy(p, PyBytes_AS_STRING(rep), repsize);
p += repsize;
} }
else { else {
/* rep is unicode */ /* rep is unicode */
if (PyUnicode_READY(rep) < 0) if (PyUnicode_READY(rep) < 0)
goto error; goto error;
repsize = PyUnicode_GET_LENGTH(rep);
p = _PyBytesWriter_Prepare(&writer, p, repsize);
if (p == NULL)
goto error;
if (!PyUnicode_IS_ASCII(rep)) { if (!PyUnicode_IS_ASCII(rep)) {
raise_encode_exception(&exc, "utf-8", raise_encode_exception(&exc, "utf-8",
unicode, unicode,

View File

@ -6706,14 +6706,12 @@ unicode_encode_ucs1(PyObject *unicode,
if (PyBytes_Check(repunicode)) { if (PyBytes_Check(repunicode)) {
/* Directly copy bytes result to output. */ /* Directly copy bytes result to output. */
repsize = PyBytes_Size(repunicode); str = _PyBytesWriter_WriteBytes(&writer, str,
PyBytes_AS_STRING(repunicode),
str = _PyBytesWriter_Prepare(&writer, str, repsize); PyBytes_GET_SIZE(repunicode));
if (str == NULL) if (str == NULL)
goto onError; goto onError;
memcpy(str, PyBytes_AsString(repunicode), repsize);
str += repsize;
pos = newpos; pos = newpos;
Py_DECREF(repunicode); Py_DECREF(repunicode);
break; break;