summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_ctypes/_ctypes.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 534ef8c..840d0df 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -238,20 +238,29 @@ PyDict_SetItemProxy(PyObject *dict, PyObject *key, PyObject *item)
return result;
}
-PyObject *
-PyDict_GetItemProxy(PyObject *dict, PyObject *key)
+static int
+_PyDict_GetItemProxy(PyObject *dict, PyObject *key, PyObject **presult)
{
- PyObject *result;
PyObject *item = PyDict_GetItemWithError(dict, key);
+ if (item == NULL) {
+ if (PyErr_Occurred()) {
+ return -1;
+ }
+ *presult = NULL;
+ return 0;
+ }
- if (item == NULL)
- return NULL;
- if (!PyWeakref_CheckProxy(item))
- return item;
- result = PyWeakref_GET_OBJECT(item);
- if (result == Py_None)
- return NULL;
- return result;
+ if (!PyWeakref_CheckProxy(item)) {
+ *presult = Py_NewRef(item);
+ return 0;
+ }
+ PyObject *ref;
+ if (PyWeakref_GetRef(item, &ref) < 0) {
+ return -1;
+ }
+ // ref is NULL if the referenced object was destroyed
+ *presult = ref;
+ return 0;
}
/******************************************************************/
@@ -4832,7 +4841,6 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length)
{
static PyObject *cache;
PyObject *key;
- PyObject *result;
char name[256];
PyObject *len;
@@ -4848,15 +4856,15 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length)
Py_DECREF(len);
if (!key)
return NULL;
- result = PyDict_GetItemProxy(cache, key);
- if (result) {
- Py_INCREF(result);
+
+ PyObject *result;
+ if (_PyDict_GetItemProxy(cache, key, &result) < 0) {
Py_DECREF(key);
- return result;
+ return NULL;
}
- else if (PyErr_Occurred()) {
+ if (result) {
Py_DECREF(key);
- return NULL;
+ return result;
}
if (!PyType_Check(itemtype)) {