]> granicus.if.org Git - python/commitdiff
Backport r61458:
authorNeal Norwitz <nnorwitz@gmail.com>
Tue, 18 Mar 2008 04:17:36 +0000 (04:17 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Tue, 18 Mar 2008 04:17:36 +0000 (04:17 +0000)
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
Objects/unicodeobject.c

index 43bc504b826581ac4dd846993f8763e710564b9a..efbfc5f2f3d647256023b990513486b17c72139c 100644 (file)
--- 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
 -------
index f2582398a8e427e9ce5e057a26f1534706346c76..c749ac51a7e5052acd19ddbe8a3b6b59f5124480 100644 (file)
@@ -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);
     }