This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients vstinner
Date 2020-11-04.16:20:34
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>
In C, the following pattern (A) is very common:

    interp->sysdict = sysdict;

* (1) Increment the reference counter
* (2) Store a reference to the object somewhere

Similar pattern (B) using return:

    return temp;

The problem in these patterns is that the object has to be written twice. I propose to add a simple new Py_NewRef() function which returns a new strong reference. In short, it's just:

static inline PyObject* Py_NewRef(PyObject *obj)
    return obj;

(The actual implementation is just a little bit more complex, to also export it as a regular function.)

Pattern (A) becomes:

    interp->sysdict = Py_NewRef(sysdict);

Pattern (B) becomes:

    return Py_NewRef(temp);

Py_NewRef() might help to prepare a C extension to be converted to HPy which uses a HPy_Dup() function. HPy_Dup() is different than "Py_INCREF(obj), obj" for subtle reasons. I let you dig into HPy documentation for the rationale:

Even if you ignore HPy, Py_NewRef() avoids to repeat the object variable, and so makes the code simpler. Simple example:

-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
+#define Py_RETURN_NONE return Py_NewRef(Py_None)
Date User Action Args
2020-11-04 16:20:34vstinnersetrecipients: + vstinner
2020-11-04 16:20:34vstinnersetmessageid: <>
2020-11-04 16:20:34vstinnerlinkissue42262 messages
2020-11-04 16:20:34vstinnercreate