[Python-checkins] r61485 - in python/branches/release25-maint: Misc/NEWS Objects/unicodeobject.c
neal.norwitz
python-checkins at python.org
Tue Mar 18 05:17:37 CET 2008
Author: neal.norwitz
Date: Tue Mar 18 05:17:36 2008
New Revision: 61485
Modified:
python/branches/release25-maint/Misc/NEWS
python/branches/release25-maint/Objects/unicodeobject.c
Log:
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.
Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS (original)
+++ python/branches/release25-maint/Misc/NEWS Tue Mar 18 05:17:36 2008
@@ -11,6 +11,8 @@
Core and builtins
-----------------
+- Issue #2321: use pymalloc for unicode object string data to reduce
+ memory usage in some circumstances.
Library
-------
Modified: python/branches/release25-maint/Objects/unicodeobject.c
==============================================================================
--- python/branches/release25-maint/Objects/unicodeobject.c (original)
+++ python/branches/release25-maint/Objects/unicodeobject.c Tue Mar 18 05:17:36 2008
@@ -200,7 +200,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
result = PyUnicode_FromUnicode(result_buf, slicelength);
- PyMem_FREE(result_buf);
+ PyObject_FREE(result_buf);
return result;
}
} else {
@@ -7948,7 +7952,7 @@
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 @@
PyUnicodeObject *v = u;
u = *(PyUnicodeObject **)u;
if (v->str)
- PyMem_DEL(v->str);
+ PyObject_DEL(v->str);
Py_XDECREF(v->defenc);
PyObject_Del(v);
}
More information about the Python-checkins
mailing list