bpo-39542: Simplify _Py_NewReference() (GH-18332)
* Remove _Py_INC_REFTOTAL and _Py_DEC_REFTOTAL macros: modify
directly _Py_RefTotal.
* _Py_ForgetReference() is no longer defined if the Py_TRACE_REFS
macro is not defined.
* Remove _Py_NewReference() implementation from object.c:
unify the two implementations in object.h inline function.
* Fix Py_TRACE_REFS build: _Py_INC_TPALLOCS() macro has been removed.
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 87f88ab..ae6b50f 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -311,7 +311,9 @@
static inline void
dictkeys_incref(PyDictKeysObject *dk)
{
- _Py_INC_REFTOTAL;
+#ifdef Py_REF_DEBUG
+ _Py_RefTotal++;
+#endif
dk->dk_refcnt++;
}
@@ -319,7 +321,9 @@
dictkeys_decref(PyDictKeysObject *dk)
{
assert(dk->dk_refcnt > 0);
- _Py_DEC_REFTOTAL;
+#ifdef Py_REF_DEBUG
+ _Py_RefTotal--;
+#endif
if (--dk->dk_refcnt == 0) {
free_keys_object(dk);
}
@@ -563,7 +567,9 @@
return NULL;
}
}
- _Py_INC_REFTOTAL;
+#ifdef Py_REF_DEBUG
+ _Py_RefTotal++;
+#endif
dk->dk_refcnt = 1;
dk->dk_size = size;
dk->dk_usable = usable;
@@ -687,10 +693,12 @@
}
/* Since we copied the keys table we now have an extra reference
- in the system. Manually call _Py_INC_REFTOTAL to signal that
+ in the system. Manually call increment _Py_RefTotal to signal that
we have it now; calling dictkeys_incref would be an error as
keys->dk_refcnt is already set to 1 (after memcpy). */
- _Py_INC_REFTOTAL;
+#ifdef Py_REF_DEBUG
+ _Py_RefTotal++;
+#endif
return (PyObject *)new;
}
@@ -1249,13 +1257,15 @@
assert(oldkeys->dk_lookup != lookdict_split);
assert(oldkeys->dk_refcnt == 1);
+#ifdef Py_REF_DEBUG
+ _Py_RefTotal--;
+#endif
if (oldkeys->dk_size == PyDict_MINSIZE &&
- numfreekeys < PyDict_MAXFREELIST) {
- _Py_DEC_REFTOTAL;
+ numfreekeys < PyDict_MAXFREELIST)
+ {
keys_free_list[numfreekeys++] = oldkeys;
}
else {
- _Py_DEC_REFTOTAL;
PyObject_FREE(oldkeys);
}
}