bpo-42262: Py_NewRef() casts its argument to PyObject* (GH-23626)
Write also unit tests on Py_NewRef() and Py_XNewRef().
This commit is contained in:
parent
7e5e13d113
commit
8b6c4a921a
|
@ -426,7 +426,6 @@ static inline void _Py_INCREF(PyObject *op)
|
|||
#endif
|
||||
op->ob_refcnt++;
|
||||
}
|
||||
|
||||
#define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op))
|
||||
|
||||
static inline void _Py_DECREF(
|
||||
|
@ -449,7 +448,6 @@ static inline void _Py_DECREF(
|
|||
_Py_Dealloc(op);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Py_REF_DEBUG
|
||||
# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
|
||||
#else
|
||||
|
@ -548,8 +546,8 @@ static inline PyObject* _Py_XNewRef(PyObject *obj)
|
|||
// Py_NewRef() and Py_XNewRef() are exported as functions for the stable ABI.
|
||||
// Names overriden with macros by static inline functions for best
|
||||
// performances.
|
||||
#define Py_NewRef(obj) _Py_NewRef(obj)
|
||||
#define Py_XNewRef(obj) _Py_XNewRef(obj)
|
||||
#define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj))
|
||||
#define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj))
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -5614,7 +5614,7 @@ static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
|
|||
|
||||
|
||||
static PyObject*
|
||||
test_set_type_size(PyObject* self, PyObject* ignored)
|
||||
test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
PyObject *obj = PyList_New(0);
|
||||
if (obj == NULL) {
|
||||
|
@ -5636,6 +5636,35 @@ test_set_type_size(PyObject* self, PyObject* ignored)
|
|||
}
|
||||
|
||||
|
||||
// Test Py_NewRef() and Py_XNewRef() functions
|
||||
static PyObject*
|
||||
test_refcount(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
PyObject *obj = PyList_New(0);
|
||||
if (obj == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
assert(Py_REFCNT(obj) == 1);
|
||||
|
||||
// Test Py_NewRef()
|
||||
PyObject *ref = Py_NewRef(obj);
|
||||
assert(ref == obj);
|
||||
assert(Py_REFCNT(obj) == 2);
|
||||
Py_DECREF(ref);
|
||||
|
||||
// Test Py_XNewRef()
|
||||
PyObject *xref = Py_XNewRef(obj);
|
||||
assert(xref == obj);
|
||||
assert(Py_REFCNT(obj) == 2);
|
||||
Py_DECREF(xref);
|
||||
|
||||
assert(Py_XNewRef(NULL) == NULL);
|
||||
|
||||
Py_DECREF(obj);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef TestMethods[] = {
|
||||
{"raise_exception", raise_exception, METH_VARARGS},
|
||||
{"raise_memoryerror", raise_memoryerror, METH_NOARGS},
|
||||
|
@ -5908,6 +5937,7 @@ static PyMethodDef TestMethods[] = {
|
|||
{"pynumber_tobase", pynumber_tobase, METH_VARARGS},
|
||||
{"without_gc", without_gc, METH_O},
|
||||
{"test_set_type_size", test_set_type_size, METH_NOARGS},
|
||||
{"test_refcount", test_refcount, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue