diff options
author | Thomas Heller <theller@ctypes.org> | 2008-01-16 19:16:27 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2008-01-16 19:16:27 (GMT) |
commit | 902d30752fa79fa787114b3f2cde37513909bc57 (patch) | |
tree | 7c6489f100a485d80b171625f937bbed11fe64dd /Modules | |
parent | 5c8b2abf71497819636474eb211655772ad1f1d8 (diff) | |
download | cpython-902d30752fa79fa787114b3f2cde37513909bc57.zip cpython-902d30752fa79fa787114b3f2cde37513909bc57.tar.gz cpython-902d30752fa79fa787114b3f2cde37513909bc57.tar.bz2 |
Convert the internal ctypes array type cache to a WeakValueDict so
that array types do not live longer than needed.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 9d7290f..1ff8e12 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -127,6 +127,7 @@ bytes(cdata) PyObject *PyExc_ArgError; static PyTypeObject Simple_Type; +PyObject *array_types_cache; char *conversion_mode_encoding = NULL; char *conversion_mode_errors = NULL; @@ -4086,16 +4087,10 @@ PyTypeObject Array_Type = { PyObject * CreateArrayType(PyObject *itemtype, Py_ssize_t length) { - static PyObject *cache; PyObject *key; PyObject *result; char name[256]; - if (cache == NULL) { - cache = PyDict_New(); - if (cache == NULL) - return NULL; - } #if (PY_VERSION_HEX < 0x02050000) key = Py_BuildValue("(Oi)", itemtype, length); #else @@ -4103,12 +4098,12 @@ CreateArrayType(PyObject *itemtype, Py_ssize_t length) #endif if (!key) return NULL; - result = PyDict_GetItem(cache, key); + result = PyObject_GetItem(array_types_cache, key); if (result) { - Py_INCREF(result); Py_DECREF(key); return result; - } + } else + PyErr_Clear(); if (!PyType_Check(itemtype)) { PyErr_SetString(PyExc_TypeError, @@ -4138,7 +4133,11 @@ CreateArrayType(PyObject *itemtype, Py_ssize_t length) ); if (!result) return NULL; - PyDict_SetItem(cache, key, result); + if (-1 == PyObject_SetItem(array_types_cache, key, result)) { + Py_DECREF(key); + Py_DECREF(result); + return NULL; + } Py_DECREF(key); return result; } @@ -4951,6 +4950,7 @@ PyMODINIT_FUNC init_ctypes(void) { PyObject *m; + PyObject *weakref; /* Note: ob_type is the metatype (the 'type'), defaults to PyType_Type, @@ -4963,6 +4963,16 @@ init_ctypes(void) if (!m) return; + weakref = PyImport_ImportModule("weakref"); + if (weakref == NULL) + return; + array_types_cache = PyObject_CallMethod(weakref, + "WeakValueDictionary", + NULL); + if (array_types_cache == NULL) + return; + Py_DECREF(weakref); + if (PyType_Ready(&PyCArg_Type) < 0) return; |