From 3a1dde8f29215418ec4e27fd6234cfa19a5407c6 Mon Sep 17 00:00:00 2001
From: Victor Stinner <vstinner@python.org>
Date: Thu, 10 Nov 2022 23:58:07 +0100
Subject: [PATCH] gh-99300: Use Py_NewRef() in Objects/ directory (#99354)

Replace Py_INCREF() and Py_XINCREF() with Py_NewRef() and
Py_XNewRef() in C files of the Objects/ directory.
---
 Objects/memoryobject.c             | 29 ++++++++++-------------------
 Objects/methodobject.c             | 15 +++++----------
 Objects/moduleobject.c             |  9 +++------
 Objects/object.c                   | 15 +++++----------
 Objects/odictobject.c              | 24 ++++++++----------------
 Objects/setobject.c                | 28 ++++++++++------------------
 Objects/sliceobject.c              | 26 +++++++++-----------------
 Objects/stringlib/join.h           |  3 +--
 Objects/stringlib/transmogrify.h   |  3 +--
 Objects/stringlib/unicode_format.h |  9 +++------
 Objects/structseq.c                |  6 ++----
 Objects/unionobject.c              | 15 +++++----------
 Objects/weakrefobject.c            | 12 ++++--------
 13 files changed, 66 insertions(+), 128 deletions(-)

diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c
index c5ab0bf2ded..1d6cc3b5084 100644
--- a/Objects/memoryobject.c
+++ b/Objects/memoryobject.c
@@ -682,8 +682,7 @@ mbuf_add_view(_PyManagedBufferObject *mbuf, const Py_buffer *src)
     init_suboffsets(dest, src);
     init_flags(mv);
 
-    mv->mbuf = mbuf;
-    Py_INCREF(mbuf);
+    mv->mbuf = (_PyManagedBufferObject*)Py_NewRef(mbuf);
     mbuf->exports++;
 
     return (PyObject *)mv;
@@ -713,8 +712,7 @@ mbuf_add_incomplete_view(_PyManagedBufferObject *mbuf, const Py_buffer *src,
     dest = &mv->view;
     init_shared_values(dest, src);
 
-    mv->mbuf = mbuf;
-    Py_INCREF(mbuf);
+    mv->mbuf = (_PyManagedBufferObject*)Py_NewRef(mbuf);
     mbuf->exports++;
 
     return (PyObject *)mv;
@@ -1102,8 +1100,7 @@ static PyObject *
 memory_enter(PyObject *self, PyObject *args)
 {
     CHECK_RELEASED(self);
-    Py_INCREF(self);
-    return self;
+    return Py_NewRef(self);
 }
 
 static PyObject *
@@ -1515,8 +1512,7 @@ memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
     }
 
 
-    view->obj = (PyObject *)self;
-    Py_INCREF(view->obj);
+    view->obj = Py_NewRef(self);
     self->exports++;
 
     return 0;
@@ -2047,10 +2043,9 @@ struct_unpack_single(const char *ptr, struct unpacker *x)
         return NULL;
 
     if (PyTuple_GET_SIZE(v) == 1) {
-        PyObject *tmp = PyTuple_GET_ITEM(v, 0);
-        Py_INCREF(tmp);
+        PyObject *res = Py_NewRef(PyTuple_GET_ITEM(v, 0));
         Py_DECREF(v);
-        return tmp;
+        return res;
     }
 
     return v;
@@ -2496,8 +2491,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
             return unpack_single(self, view->buf, fmt);
         }
         else if (key == Py_Ellipsis) {
-            Py_INCREF(self);
-            return (PyObject *)self;
+            return Py_NewRef(self);
         }
         else {
             PyErr_SetString(PyExc_TypeError,
@@ -2957,8 +2951,7 @@ memory_richcompare(PyObject *v, PyObject *w, int op)
     unpacker_free(unpack_v);
     unpacker_free(unpack_w);
 
-    Py_XINCREF(res);
-    return res;
+    return Py_XNewRef(res);
 }
 
 /**************************************************************************/
@@ -3052,8 +3045,7 @@ memory_obj_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored))
     if (view->obj == NULL) {
         Py_RETURN_NONE;
     }
-    Py_INCREF(view->obj);
-    return view->obj;
+    return Py_NewRef(view->obj);
 }
 
 static PyObject *
@@ -3281,8 +3273,7 @@ memory_iter(PyObject *seq)
     it->it_fmt = fmt;
     it->it_length = memory_length(obj);
     it->it_index = 0;
-    Py_INCREF(seq);
-    it->it_seq = obj;
+    it->it_seq = (PyMemoryViewObject*)Py_NewRef(obj);
     _PyObject_GC_TRACK(it);
     return (PyObject *)it;
 }
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 953cf4666d3..51752dec3dd 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -88,8 +88,7 @@ PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *c
         if (om == NULL) {
             return NULL;
         }
-        Py_INCREF(cls);
-        om->mm_class = cls;
+        om->mm_class = (PyTypeObject*)Py_NewRef(cls);
         op = (PyCFunctionObject *)om;
     } else {
         if (cls) {
@@ -106,10 +105,8 @@ PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *c
 
     op->m_weakreflist = NULL;
     op->m_ml = ml;
-    Py_XINCREF(self);
-    op->m_self = self;
-    Py_XINCREF(module);
-    op->m_module = module;
+    op->m_self = Py_XNewRef(self);
+    op->m_module = Py_XNewRef(module);
     op->vectorcall = vectorcall;
     _PyObject_GC_TRACK(op);
     return (PyObject *)op;
@@ -260,8 +257,7 @@ meth_get__self__(PyCFunctionObject *m, void *closure)
     self = PyCFunction_GET_SELF(m);
     if (self == NULL)
         self = Py_None;
-    Py_INCREF(self);
-    return self;
+    return Py_NewRef(self);
 }
 
 static PyGetSetDef meth_getsets [] = {
@@ -314,8 +310,7 @@ meth_richcompare(PyObject *self, PyObject *other, int op)
         res = eq ? Py_True : Py_False;
     else
         res = eq ? Py_False : Py_True;
-    Py_INCREF(res);
-    return res;
+    return Py_NewRef(res);
 }
 
 static Py_hash_t
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index ee8ef7f5b4a..a1d09a6e460 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -70,8 +70,7 @@ module_init_dict(PyModuleObject *mod, PyObject *md_dict,
     if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
         return -1;
     if (PyUnicode_CheckExact(name)) {
-        Py_INCREF(name);
-        Py_XSETREF(mod->md_name, name);
+        Py_XSETREF(mod->md_name, Py_NewRef(name));
     }
 
     return 0;
@@ -506,8 +505,7 @@ PyModule_GetNameObject(PyObject *m)
         }
         return NULL;
     }
-    Py_INCREF(name);
-    return name;
+    return Py_NewRef(name);
 }
 
 const char *
@@ -541,8 +539,7 @@ PyModule_GetFilenameObject(PyObject *m)
         }
         return NULL;
     }
-    Py_INCREF(fileobj);
-    return fileobj;
+    return Py_NewRef(fileobj);
 }
 
 const char *
diff --git a/Objects/object.c b/Objects/object.c
index 837f0a1a578..01eede94d58 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -455,8 +455,7 @@ PyObject_Str(PyObject *v)
         if (PyUnicode_READY(v) < 0)
             return NULL;
 #endif
-        Py_INCREF(v);
-        return v;
+        return Py_NewRef(v);
     }
     if (Py_TYPE(v)->tp_str == NULL)
         return PyObject_Repr(v);
@@ -532,8 +531,7 @@ PyObject_Bytes(PyObject *v)
         return PyBytes_FromString("<NULL>");
 
     if (PyBytes_CheckExact(v)) {
-        Py_INCREF(v);
-        return v;
+        return Py_NewRef(v);
     }
 
     func = _PyObject_LookupSpecial(v, &_Py_ID(__bytes__));
@@ -689,8 +687,7 @@ do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op)
                       Py_TYPE(w)->tp_name);
         return NULL;
     }
-    Py_INCREF(res);
-    return res;
+    return Py_NewRef(res);
 }
 
 /* Perform a rich comparison with object result.  This wraps do_richcompare()
@@ -1096,8 +1093,7 @@ _PyObject_GetDictPtr(PyObject *obj)
 PyObject *
 PyObject_SelfIter(PyObject *obj)
 {
-    Py_INCREF(obj);
-    return obj;
+    return Py_NewRef(obj);
 }
 
 /* Helper used when the __next__ method is removed from a type:
@@ -1481,8 +1477,7 @@ PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
                      "not a '%.200s'", Py_TYPE(value)->tp_name);
         return -1;
     }
-    Py_INCREF(value);
-    Py_XSETREF(*dictptr, value);
+    Py_XSETREF(*dictptr, Py_NewRef(value));
     return 0;
 }
 
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index bd2a7677fe1..33af1d1d52b 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -889,8 +889,7 @@ odict_inplace_or(PyObject *self, PyObject *other)
     if (mutablemapping_update_arg(self, other) < 0) {
         return NULL;
     }
-    Py_INCREF(self);
-    return self;
+    return Py_NewRef(self);
 }
 
 /* tp_as_number */
@@ -1007,8 +1006,7 @@ OrderedDict_setdefault_impl(PyODictObject *self, PyObject *key,
                 return NULL;
             assert(_odict_find_node(self, key) == NULL);
             if (PyODict_SetItem((PyObject *)self, key, default_value) >= 0) {
-                result = default_value;
-                Py_INCREF(result);
+                result = Py_NewRef(default_value);
             }
         }
         else {
@@ -1024,8 +1022,7 @@ OrderedDict_setdefault_impl(PyODictObject *self, PyObject *key,
             result = PyObject_GetItem((PyObject *)self, key);
         }
         else if (PyObject_SetItem((PyObject *)self, key, default_value) >= 0) {
-            result = default_value;
-            Py_INCREF(result);
+            result = Py_NewRef(default_value);
         }
     }
 
@@ -1055,8 +1052,7 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj,
     else if (value == NULL && !PyErr_Occurred()) {
         /* Apply the fallback value, if necessary. */
         if (failobj) {
-            value = failobj;
-            Py_INCREF(failobj);
+            value = Py_NewRef(failobj);
         }
         else {
             PyErr_SetObject(PyExc_KeyError, key);
@@ -1497,8 +1493,7 @@ odict_richcompare(PyObject *v, PyObject *w, int op)
             return NULL;
 
         res = (eq == (op == Py_EQ)) ? Py_True : Py_False;
-        Py_INCREF(res);
-        return res;
+        return Py_NewRef(res);
     } else {
         Py_RETURN_NOTIMPLEMENTED;
     }
@@ -1714,8 +1709,7 @@ odictiter_nextkey(odictiterobject *di)
         di->di_current = NULL;
     }
     else {
-        di->di_current = _odictnode_KEY(node);
-        Py_INCREF(di->di_current);
+        di->di_current = Py_NewRef(_odictnode_KEY(node));
     }
 
     return key;
@@ -1872,12 +1866,10 @@ odictiter_new(PyODictObject *od, int kind)
 
     di->kind = kind;
     node = reversed ? _odict_LAST(od) : _odict_FIRST(od);
-    di->di_current = node ? _odictnode_KEY(node) : NULL;
-    Py_XINCREF(di->di_current);
+    di->di_current = node ? Py_NewRef(_odictnode_KEY(node)) : NULL;
     di->di_size = PyODict_SIZE(od);
     di->di_state = od->od_state;
-    di->di_odict = od;
-    Py_INCREF(od);
+    di->di_odict = (PyODictObject*)Py_NewRef(od);
 
     _PyObject_GC_TRACK(di);
     return (PyObject *)di;
diff --git a/Objects/setobject.c b/Objects/setobject.c
index dd55a943010..3c510b5d1ac 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -588,8 +588,7 @@ set_merge(PySetObject *so, PyObject *otherset)
             key = other_entry->key;
             if (key != NULL) {
                 assert(so_entry->key == NULL);
-                Py_INCREF(key);
-                so_entry->key = key;
+                so_entry->key = Py_NewRef(key);
                 so_entry->hash = other_entry->hash;
             }
         }
@@ -607,8 +606,8 @@ set_merge(PySetObject *so, PyObject *otherset)
         for (i = other->mask + 1; i > 0 ; i--, other_entry++) {
             key = other_entry->key;
             if (key != NULL && key != dummy) {
-                Py_INCREF(key);
-                set_insert_clean(newtable, newmask, key, other_entry->hash);
+                set_insert_clean(newtable, newmask, Py_NewRef(key),
+                                 other_entry->hash);
             }
         }
         return 0;
@@ -820,8 +819,7 @@ static PyObject *setiter_iternext(setiterobject *si)
         goto fail;
     si->len--;
     key = entry[i].key;
-    Py_INCREF(key);
-    return key;
+    return Py_NewRef(key);
 
 fail:
     si->si_set = NULL;
@@ -868,8 +866,7 @@ set_iter(PySetObject *so)
     setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
     if (si == NULL)
         return NULL;
-    Py_INCREF(so);
-    si->si_set = so;
+    si->si_set = (PySetObject*)Py_NewRef(so);
     si->si_used = so->used;
     si->si_pos = 0;
     si->len = so->used;
@@ -997,8 +994,7 @@ make_new_frozenset(PyTypeObject *type, PyObject *iterable)
 
     if (iterable != NULL && PyFrozenSet_CheckExact(iterable)) {
         /* frozenset(f) is idempotent */
-        Py_INCREF(iterable);
-        return iterable;
+        return Py_NewRef(iterable);
     }
     return make_new_set(type, iterable);
 }
@@ -1100,8 +1096,7 @@ static PyObject *
 frozenset_copy(PySetObject *so, PyObject *Py_UNUSED(ignored))
 {
     if (PyFrozenSet_CheckExact(so)) {
-        Py_INCREF(so);
-        return (PyObject *)so;
+        return Py_NewRef(so);
     }
     return set_copy(so, NULL);
 }
@@ -1173,8 +1168,7 @@ set_ior(PySetObject *so, PyObject *other)
 
     if (set_update_internal(so, other))
         return NULL;
-    Py_INCREF(so);
-    return (PyObject *)so;
+    return Py_NewRef(so);
 }
 
 static PyObject *
@@ -1264,12 +1258,11 @@ static PyObject *
 set_intersection_multi(PySetObject *so, PyObject *args)
 {
     Py_ssize_t i;
-    PyObject *result = (PyObject *)so;
 
     if (PyTuple_GET_SIZE(args) == 0)
         return set_copy(so, NULL);
 
-    Py_INCREF(so);
+    PyObject *result = Py_NewRef(so);
     for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
         PyObject *other = PyTuple_GET_ITEM(args, i);
         PyObject *newresult = set_intersection((PySetObject *)result, other);
@@ -1336,8 +1329,7 @@ set_iand(PySetObject *so, PyObject *other)
     if (result == NULL)
         return NULL;
     Py_DECREF(result);
-    Py_INCREF(so);
-    return (PyObject *)so;
+    return Py_NewRef(so);
 }
 
 static PyObject *
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index e37623f38ba..1da1df30907 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -26,8 +26,7 @@ ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
         PyErr_SetString(PyExc_TypeError, "EllipsisType takes no arguments");
         return NULL;
     }
-    Py_INCREF(Py_Ellipsis);
-    return Py_Ellipsis;
+    return Py_NewRef(Py_Ellipsis);
 }
 
 static PyObject *
@@ -153,9 +152,8 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
     if (stop == NULL) {
         stop = Py_None;
     }
-    Py_INCREF(start);
-    Py_INCREF(stop);
-    return (PyObject *) _PyBuildSlice_Consume2(start, stop, step);
+    return (PyObject *)_PyBuildSlice_Consume2(Py_NewRef(start),
+                                              Py_NewRef(stop), step);
 }
 
 PyObject *
@@ -406,8 +404,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
 
     /* Convert step to an integer; raise for zero step. */
     if (self->step == Py_None) {
-        step = _PyLong_GetOne();
-        Py_INCREF(step);
+        step = Py_NewRef(_PyLong_GetOne());
         step_is_negative = 0;
     }
     else {
@@ -435,16 +432,13 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
             goto error;
     }
     else {
-        lower = _PyLong_GetZero();
-        Py_INCREF(lower);
-        upper = length;
-        Py_INCREF(upper);
+        lower = Py_NewRef(_PyLong_GetZero());
+        upper = Py_NewRef(length);
     }
 
     /* Compute start. */
     if (self->start == Py_None) {
-        start = step_is_negative ? upper : lower;
-        Py_INCREF(start);
+        start = Py_NewRef(step_is_negative ? upper : lower);
     }
     else {
         start = evaluate_slice_index(self->start);
@@ -482,8 +476,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
 
     /* Compute stop. */
     if (self->stop == Py_None) {
-        stop = step_is_negative ? lower : upper;
-        Py_INCREF(stop);
+        stop = Py_NewRef(step_is_negative ? lower : upper);
     }
     else {
         stop = evaluate_slice_index(self->stop);
@@ -609,8 +602,7 @@ slice_richcompare(PyObject *v, PyObject *w, int op)
             res = Py_False;
             break;
         }
-        Py_INCREF(res);
-        return res;
+        return Py_NewRef(res);
     }
 
 
diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h
index bb011f7db79..de6bd83ffe4 100644
--- a/Objects/stringlib/join.h
+++ b/Objects/stringlib/join.h
@@ -63,8 +63,7 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable)
         item = PySequence_Fast_GET_ITEM(seq, i);
         if (PyBytes_CheckExact(item)) {
             /* Fast path. */
-            Py_INCREF(item);
-            buffers[i].obj = item;
+            buffers[i].obj = Py_NewRef(item);
             buffers[i].buf = PyBytes_AS_STRING(item);
             buffers[i].len = PyBytes_GET_SIZE(item);
         }
diff --git a/Objects/stringlib/transmogrify.h b/Objects/stringlib/transmogrify.h
index e1165ea38e8..71099bb586e 100644
--- a/Objects/stringlib/transmogrify.h
+++ b/Objects/stringlib/transmogrify.h
@@ -17,8 +17,7 @@ return_self(PyObject *self)
 {
 #if !STRINGLIB_MUTABLE
     if (STRINGLIB_CHECK_EXACT(self)) {
-        Py_INCREF(self);
-        return self;
+        return Py_NewRef(self);
     }
 #endif
     return STRINGLIB_NEW(STRINGLIB_STR(self), STRINGLIB_LEN(self));
diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h
index a4eea7b9198..e970588a7e3 100644
--- a/Objects/stringlib/unicode_format.h
+++ b/Objects/stringlib/unicode_format.h
@@ -1042,8 +1042,7 @@ formatteriter_next(formatteriterobject *it)
            otherwise create a one length string with the conversion
            character */
         if (conversion == '\0') {
-            conversion_str = Py_None;
-            Py_INCREF(conversion_str);
+            conversion_str = Py_NewRef(Py_None);
         }
         else
             conversion_str = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
@@ -1121,8 +1120,7 @@ formatter_parser(PyObject *ignored, PyObject *self)
         return NULL;
 
     /* take ownership, give the object to the iterator */
-    Py_INCREF(self);
-    it->str = self;
+    it->str = Py_NewRef(self);
 
     /* initialize the contained MarkupIterator */
     MarkupIterator_init(&it->it_markup, (PyObject*)self, 0, PyUnicode_GET_LENGTH(self));
@@ -1265,8 +1263,7 @@ formatter_field_name_split(PyObject *ignored, PyObject *self)
 
     /* take ownership, give the object to the iterator.  this is
        just to keep the field_name alive */
-    Py_INCREF(self);
-    it->str = self;
+    it->str = Py_NewRef(self);
 
     /* Pass in auto_number = NULL. We'll return an empty string for
        first_obj in that case. */
diff --git a/Objects/structseq.c b/Objects/structseq.c
index 9a7013372e6..100ccfef0a2 100644
--- a/Objects/structseq.c
+++ b/Objects/structseq.c
@@ -200,8 +200,7 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict)
     }
     for (i = 0; i < len; ++i) {
         PyObject *v = PySequence_Fast_GET_ITEM(arg, i);
-        Py_INCREF(v);
-        res->ob_item[i] = v;
+        res->ob_item[i] = Py_NewRef(v);
     }
     Py_DECREF(arg);
     for (; i < max_len; ++i) {
@@ -219,8 +218,7 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict)
                 ob = Py_None;
             }
         }
-        Py_INCREF(ob);
-        res->ob_item[i] = ob;
+        res->ob_item[i] = Py_NewRef(ob);
     }
 
     _PyObject_GC_TRACK(res);
diff --git a/Objects/unionobject.c b/Objects/unionobject.c
index 5eee27c08fa..b2ac3509cee 100644
--- a/Objects/unionobject.c
+++ b/Objects/unionobject.c
@@ -114,12 +114,10 @@ merge(PyObject **items1, Py_ssize_t size1,
             }
             for (; pos < size1; pos++) {
                 PyObject *a = items1[pos];
-                Py_INCREF(a);
-                PyTuple_SET_ITEM(tuple, pos, a);
+                PyTuple_SET_ITEM(tuple, pos, Py_NewRef(a));
             }
         }
-        Py_INCREF(arg);
-        PyTuple_SET_ITEM(tuple, pos, arg);
+        PyTuple_SET_ITEM(tuple, pos, Py_NewRef(arg));
         pos++;
     }
 
@@ -170,8 +168,7 @@ _Py_union_type_or(PyObject* self, PyObject* other)
         if (PyErr_Occurred()) {
             return NULL;
         }
-        Py_INCREF(self);
-        return self;
+        return Py_NewRef(self);
     }
 
     PyObject *new_union = make_union(tuple);
@@ -326,8 +323,7 @@ union_parameters(PyObject *self, void *Py_UNUSED(unused))
             return NULL;
         }
     }
-    Py_INCREF(alias->parameters);
-    return alias->parameters;
+    return Py_NewRef(alias->parameters);
 }
 
 static PyGetSetDef union_properties[] = {
@@ -400,9 +396,8 @@ make_union(PyObject *args)
         return NULL;
     }
 
-    Py_INCREF(args);
     result->parameters = NULL;
-    result->args = args;
+    result->args = Py_NewRef(args);
     _PyObject_GC_TRACK(result);
     return (PyObject*)result;
 }
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index cf89a9231d2..ff284c882b0 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -311,8 +311,7 @@ weakref___new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
         if (callback == NULL && type == &_PyWeakref_RefType) {
             if (ref != NULL) {
                 /* We can re-use an existing reference. */
-                Py_INCREF(ref);
-                return (PyObject *)ref;
+                return Py_NewRef(ref);
             }
         }
         /* We have to create a new reference. */
@@ -826,8 +825,7 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
                        to avoid violating the invariants of the list
                        of weakrefs for ob. */
                     Py_DECREF(result);
-                    Py_INCREF(ref);
-                    result = ref;
+                    result = (PyWeakReference*)Py_NewRef(ref);
                 }
             }
             else {
@@ -891,8 +889,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
                        to avoid violating the invariants of the list
                        of weakrefs for ob. */
                     Py_DECREF(result);
-                    result = proxy;
-                    Py_INCREF(result);
+                    result = (PyWeakReference*)Py_NewRef(proxy);
                     goto skip_insert;
                 }
                 prev = ref;
@@ -993,8 +990,7 @@ PyObject_ClearWeakRefs(PyObject *object)
                 PyWeakReference *next = current->wr_next;
 
                 if (Py_REFCNT((PyObject *)current) > 0) {
-                    Py_INCREF(current);
-                    PyTuple_SET_ITEM(tuple, i * 2, (PyObject *) current);
+                    PyTuple_SET_ITEM(tuple, i * 2, Py_NewRef(current));
                     PyTuple_SET_ITEM(tuple, i * 2 + 1, current->wr_callback);
                 }
                 else {
-- 
GitLab