From b3635f99a23bcec31e73f4021c32c41a03152304 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Tue, 18 Mar 2008 04:17:36 +0000 Subject: [PATCH] Backport r61458: Issue 2321: reduce memory usage (increase the memory that is returned to the system) by using pymalloc for the data of unicode objects. --- Misc/NEWS | 2 ++ Objects/unicodeobject.c | 26 +++++++++++++++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 43bc504b82..efbfc5f2f3 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -11,6 +11,8 @@ What's New in Python 2.5.3? Core and builtins ----------------- +- Issue #2321: use pymalloc for unicode object string data to reduce + memory usage in some circumstances. Library ------- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f2582398a8..c749ac51a7 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -200,7 +200,8 @@ int unicode_resize(register PyUnicodeObject *unicode, it contains). */ oldstr = unicode->str; - PyMem_RESIZE(unicode->str, Py_UNICODE, length + 1); + unicode->str = PyObject_REALLOC(unicode->str, + sizeof(Py_UNICODE) * (length + 1)); if (!unicode->str) { unicode->str = (Py_UNICODE *)oldstr; PyErr_NoMemory(); @@ -249,20 +250,23 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length) never downsize it. */ if ((unicode->length < length) && unicode_resize(unicode, length) < 0) { - PyMem_DEL(unicode->str); + PyObject_DEL(unicode->str); goto onError; } } else { - unicode->str = PyMem_NEW(Py_UNICODE, length + 1); + size_t new_size = sizeof(Py_UNICODE) * ((size_t)length + 1); + unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size); } PyObject_INIT(unicode, &PyUnicode_Type); } else { + size_t new_size; unicode = PyObject_New(PyUnicodeObject, &PyUnicode_Type); if (unicode == NULL) return NULL; - unicode->str = PyMem_NEW(Py_UNICODE, length + 1); + new_size = sizeof(Py_UNICODE) * ((size_t)length + 1); + unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size); } if (!unicode->str) { @@ -296,7 +300,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode) unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) { /* Keep-Alive optimization */ if (unicode->length >= KEEPALIVE_SIZE_LIMIT) { - PyMem_DEL(unicode->str); + PyObject_DEL(unicode->str); unicode->str = NULL; unicode->length = 0; } @@ -310,7 +314,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode) unicode_freelist_size++; } else { - PyMem_DEL(unicode->str); + PyObject_DEL(unicode->str); Py_XDECREF(unicode->defenc); unicode->ob_type->tp_free((PyObject *)unicode); } @@ -7129,8 +7133,8 @@ unicode_subscript(PyUnicodeObject* self, PyObject* item) return PyUnicode_FromUnicode(NULL, 0); } else { source_buf = PyUnicode_AS_UNICODE((PyObject*)self); - result_buf = (Py_UNICODE *)PyMem_MALLOC(slicelength* - sizeof(Py_UNICODE)); + result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength* + sizeof(Py_UNICODE)); if (result_buf == NULL) return PyErr_NoMemory(); @@ -7140,7 +7144,7 @@ unicode_subscript(PyUnicodeObject* self, PyObject* item) } result = PyUnicode_FromUnicode(result_buf, slicelength); - PyMem_FREE(result_buf); + PyObject_FREE(result_buf); return result; } } else { @@ -7948,7 +7952,7 @@ unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(tmp); return NULL; } - pnew->str = PyMem_NEW(Py_UNICODE, n+1); + pnew->str = (Py_UNICODE*) PyObject_MALLOC(sizeof(Py_UNICODE) * (n+1)); if (pnew->str == NULL) { _Py_ForgetReference((PyObject *)pnew); PyObject_Del(pnew); @@ -8075,7 +8079,7 @@ _PyUnicode_Fini(void) PyUnicodeObject *v = u; u = *(PyUnicodeObject **)u; if (v->str) - PyMem_DEL(v->str); + PyObject_DEL(v->str); Py_XDECREF(v->defenc); PyObject_Del(v); } -- 2.40.0