summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorAivars Kalvāns <aivars.kalvans@gmail.com>2022-07-27 08:43:34 (GMT)
committerGitHub <noreply@github.com>2022-07-27 08:43:34 (GMT)
commit8c88e360e71c8fd456b261f5c5ccc2d8e4db63a0 (patch)
tree9b843cce89cc6023014df88ff45ce5eead7a5bad /Objects
parent565403038b75eb64ea483b2757ba30769246d853 (diff)
downloadcpython-8c88e360e71c8fd456b261f5c5ccc2d8e4db63a0.zip
cpython-8c88e360e71c8fd456b261f5c5ccc2d8e4db63a0.tar.gz
cpython-8c88e360e71c8fd456b261f5c5ccc2d8e4db63a0.tar.bz2
gh-95005: Replace PyAccu with PyUnicodeWriter (gh-95006)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/accu.c115
1 files changed, 0 insertions, 115 deletions
diff --git a/Objects/accu.c b/Objects/accu.c
deleted file mode 100644
index c8b5d38..0000000
--- a/Objects/accu.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Accumulator struct implementation */
-
-#include "Python.h"
-#include "pycore_accu.h"
-
-static PyObject *
-join_list_unicode(PyObject *lst)
-{
- /* return ''.join(lst) */
- PyObject *sep, *ret;
- sep = PyUnicode_FromStringAndSize("", 0);
- ret = PyUnicode_Join(sep, lst);
- Py_DECREF(sep);
- return ret;
-}
-
-int
-_PyAccu_Init(_PyAccu *acc)
-{
- /* Lazily allocated */
- acc->large = NULL;
- acc->small = PyList_New(0);
- if (acc->small == NULL)
- return -1;
- return 0;
-}
-
-static int
-flush_accumulator(_PyAccu *acc)
-{
- Py_ssize_t nsmall = PyList_GET_SIZE(acc->small);
- if (nsmall) {
- int ret;
- PyObject *joined;
- if (acc->large == NULL) {
- acc->large = PyList_New(0);
- if (acc->large == NULL)
- return -1;
- }
- joined = join_list_unicode(acc->small);
- if (joined == NULL)
- return -1;
- if (PyList_SetSlice(acc->small, 0, nsmall, NULL)) {
- Py_DECREF(joined);
- return -1;
- }
- ret = PyList_Append(acc->large, joined);
- Py_DECREF(joined);
- return ret;
- }
- return 0;
-}
-
-int
-_PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode)
-{
- Py_ssize_t nsmall;
- assert(PyUnicode_Check(unicode));
-
- if (PyList_Append(acc->small, unicode))
- return -1;
- nsmall = PyList_GET_SIZE(acc->small);
- /* Each item in a list of unicode objects has an overhead (in 64-bit
- * builds) of:
- * - 8 bytes for the list slot
- * - 56 bytes for the header of the unicode object
- * that is, 64 bytes. 100000 such objects waste more than 6 MiB
- * compared to a single concatenated string.
- */
- if (nsmall < 100000)
- return 0;
- return flush_accumulator(acc);
-}
-
-PyObject *
-_PyAccu_FinishAsList(_PyAccu *acc)
-{
- int ret;
- PyObject *res;
-
- ret = flush_accumulator(acc);
- Py_CLEAR(acc->small);
- if (ret) {
- Py_CLEAR(acc->large);
- return NULL;
- }
- res = acc->large;
- acc->large = NULL;
- return res;
-}
-
-PyObject *
-_PyAccu_Finish(_PyAccu *acc)
-{
- PyObject *list, *res;
- if (acc->large == NULL) {
- list = acc->small;
- acc->small = NULL;
- }
- else {
- list = _PyAccu_FinishAsList(acc);
- if (!list)
- return NULL;
- }
- res = join_list_unicode(list);
- Py_DECREF(list);
- return res;
-}
-
-void
-_PyAccu_Destroy(_PyAccu *acc)
-{
- Py_CLEAR(acc->small);
- Py_CLEAR(acc->large);
-}