mirror of https://github.com/python/cpython
Add _PyBytesWriter_WriteBytes() to factorize the code
This commit is contained in:
parent
ad7715891e
commit
ce179bf6ba
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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))
|
|
||||||
repsize = PyBytes_GET_SIZE(rep);
|
|
||||||
else
|
|
||||||
repsize = PyUnicode_GET_LENGTH(rep);
|
|
||||||
|
|
||||||
p = _PyBytesWriter_Prepare(&writer, p, repsize);
|
|
||||||
if (p == NULL)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (PyBytes_Check(rep)) {
|
if (PyBytes_Check(rep)) {
|
||||||
memcpy(p, PyBytes_AS_STRING(rep), repsize);
|
p = _PyBytesWriter_WriteBytes(&writer, p,
|
||||||
p += repsize;
|
PyBytes_AS_STRING(rep),
|
||||||
|
PyBytes_GET_SIZE(rep));
|
||||||
|
if (p == NULL)
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue