[Python-checkins] bpo-42262: Py_NewRef() casts its argument to PyObject* (GH-23626)

vstinner webhook-mailer at python.org
Thu Dec 3 08:01:18 EST 2020


https://github.com/python/cpython/commit/8b6c4a921af6d5d0a9640211ac93d7886a55a8f3
commit: 8b6c4a921af6d5d0a9640211ac93d7886a55a8f3
branch: master
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2020-12-03T14:01:10+01:00
summary:

bpo-42262: Py_NewRef() casts its argument to PyObject* (GH-23626)

Write also unit tests on Py_NewRef() and Py_XNewRef().

files:
M Include/object.h
M Modules/_testcapimodule.c

diff --git a/Include/object.h b/Include/object.h
index f68423a09c4e4..8d0039428e73a 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -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))
 
 
 /*
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index d2104423c5890..4f97927fa2322 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -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 */
 };
 



More information about the Python-checkins mailing list