gh-105927: _ctypes use PyWeakref_GetRef() (#105964)

Rename PyDict_GetItemProxy() to _PyDict_GetItemProxy() and mark it as
static. _PyDict_GetItemProxy() now returns a strong reference,
instead of a borrowed reference: replace PyWeakref_GET_OBJECT() with
_PyWeakref_GET_REF().
This commit is contained in:
Victor Stinner 2023-06-21 16:34:27 +02:00 committed by GitHub
parent 74da6f7c9f
commit 48d107a87d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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,16 +4856,16 @@ 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);
Py_DECREF(key);
return result;
}
else if (PyErr_Occurred()) {
PyObject *result;
if (_PyDict_GetItemProxy(cache, key, &result) < 0) {
Py_DECREF(key);
return NULL;
}
if (result) {
Py_DECREF(key);
return result;
}
if (!PyType_Check(itemtype)) {
PyErr_SetString(PyExc_TypeError,