Skip to content

Commit 4890f65

Browse files
authored
gh-108308: Use PyDict_GetItemRef() in moduleobject.c (#108381)
Replace PyDict_GetItemWithError() with PyDict_GetItemRef() which returns a strong reference. Cleanup also the function: move variable definition to their first assignation, rename variable names to use name longer than 1 character.
1 parent 592bacb commit 4890f65

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

Objects/moduleobject.c

+40-28
Original file line numberDiff line numberDiff line change
@@ -510,25 +510,31 @@ PyModule_GetDict(PyObject *m)
510510
}
511511

512512
PyObject*
513-
PyModule_GetNameObject(PyObject *m)
513+
PyModule_GetNameObject(PyObject *mod)
514514
{
515-
PyObject *d;
516-
PyObject *name;
517-
if (!PyModule_Check(m)) {
515+
if (!PyModule_Check(mod)) {
518516
PyErr_BadArgument();
519517
return NULL;
520518
}
521-
d = ((PyModuleObject *)m)->md_dict;
522-
if (d == NULL || !PyDict_Check(d) ||
523-
(name = PyDict_GetItemWithError(d, &_Py_ID(__name__))) == NULL ||
524-
!PyUnicode_Check(name))
525-
{
526-
if (!PyErr_Occurred()) {
527-
PyErr_SetString(PyExc_SystemError, "nameless module");
528-
}
529-
return NULL;
519+
PyObject *dict = ((PyModuleObject *)mod)->md_dict; // borrowed reference
520+
if (dict == NULL || !PyDict_Check(dict)) {
521+
goto error;
522+
}
523+
PyObject *name;
524+
if (PyDict_GetItemRef(dict, &_Py_ID(__name__), &name) <= 0) {
525+
goto error;
526+
}
527+
if (!PyUnicode_Check(name)) {
528+
Py_DECREF(name);
529+
goto error;
530+
}
531+
return name;
532+
533+
error:
534+
if (!PyErr_Occurred()) {
535+
PyErr_SetString(PyExc_SystemError, "nameless module");
530536
}
531-
return Py_NewRef(name);
537+
return NULL;
532538
}
533539

534540
const char *
@@ -544,25 +550,31 @@ PyModule_GetName(PyObject *m)
544550
}
545551

546552
PyObject*
547-
PyModule_GetFilenameObject(PyObject *m)
553+
PyModule_GetFilenameObject(PyObject *mod)
548554
{
549-
PyObject *d;
550-
PyObject *fileobj;
551-
if (!PyModule_Check(m)) {
555+
if (!PyModule_Check(mod)) {
552556
PyErr_BadArgument();
553557
return NULL;
554558
}
555-
d = ((PyModuleObject *)m)->md_dict;
556-
if (d == NULL ||
557-
(fileobj = PyDict_GetItemWithError(d, &_Py_ID(__file__))) == NULL ||
558-
!PyUnicode_Check(fileobj))
559-
{
560-
if (!PyErr_Occurred()) {
561-
PyErr_SetString(PyExc_SystemError, "module filename missing");
562-
}
563-
return NULL;
559+
PyObject *dict = ((PyModuleObject *)mod)->md_dict; // borrowed reference
560+
if (dict == NULL) {
561+
goto error;
564562
}
565-
return Py_NewRef(fileobj);
563+
PyObject *fileobj;
564+
if (PyDict_GetItemRef(dict, &_Py_ID(__file__), &fileobj) <= 0) {
565+
goto error;
566+
}
567+
if (!PyUnicode_Check(fileobj)) {
568+
Py_DECREF(fileobj);
569+
goto error;
570+
}
571+
return fileobj;
572+
573+
error:
574+
if (!PyErr_Occurred()) {
575+
PyErr_SetString(PyExc_SystemError, "module filename missing");
576+
}
577+
return NULL;
566578
}
567579

568580
const char *

0 commit comments

Comments
 (0)