summaryrefslogtreecommitdiffstats
path: root/Objects/unicodeobject.c
diff options
context:
space:
mode:
authorInada Naoki <songofacandy@gmail.com>2020-03-14 03:43:18 (GMT)
committerGitHub <noreply@github.com>2020-03-14 03:43:18 (GMT)
commitc7ad974d341d3edb6b9d2a2dcae4d3d4794ada6b (patch)
tree2026fd46b762fb2deaf9091e4d7e09dc198bc2d3 /Objects/unicodeobject.c
parent8fb02b6e1942811c8d81041e7df3f5f1f4b1d410 (diff)
downloadcpython-c7ad974d341d3edb6b9d2a2dcae4d3d4794ada6b.zip
cpython-c7ad974d341d3edb6b9d2a2dcae4d3d4794ada6b.tar.gz
cpython-c7ad974d341d3edb6b9d2a2dcae4d3d4794ada6b.tar.bz2
bpo-39087: Add _PyUnicode_GetUTF8Buffer() (GH-17659)
Co-authored-by: Victor Stinner <vstinner@python.org>
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r--Objects/unicodeobject.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 3d99f11..0fea435 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3991,6 +3991,41 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
}
+int
+_PyUnicode_GetUTF8Buffer(PyObject *unicode, const char *errors,
+ Py_buffer *view)
+{
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadArgument();
+ return -1;
+ }
+ if (PyUnicode_READY(unicode) == -1) {
+ return -1;
+ }
+
+ if (PyUnicode_UTF8(unicode) != NULL
+ && Py_TYPE(unicode)->tp_as_buffer == NULL) {
+ return PyBuffer_FillInfo(view, unicode,
+ PyUnicode_UTF8(unicode),
+ PyUnicode_UTF8_LENGTH(unicode),
+ /* readonly */ 1, PyBUF_SIMPLE);
+ }
+
+ // Unlike PyUnicode_AsUTF8AndSize(), this function doesn't
+ // create a UTF-8 cache for speed and efficiency.
+ PyObject *bytes = _PyUnicode_AsUTF8String(unicode, errors);
+ if (bytes == NULL) {
+ return -1;
+ }
+ assert(PyBytes_CheckExact(bytes));
+ if (PyObject_GetBuffer(bytes, view, PyBUF_SIMPLE) < 0) {
+ Py_DECREF(bytes);
+ return -1;
+ }
+ return 0;
+}
+
+
static int unicode_fill_utf8(PyObject *unicode);
const char *