mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
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:
parent
74da6f7c9f
commit
48d107a87d
1 changed files with 27 additions and 19 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue