gh-111789: Simplify import.c by using PyDict_GetItemRef() (GH-111979)

This commit is contained in:
Serhiy Storchaka 2023-11-14 11:29:20 +02:00 committed by GitHub
parent c98600bed4
commit 95365625f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2372,11 +2372,11 @@ get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
if (nhooks < 0) if (nhooks < 0)
return NULL; /* Shouldn't happen */ return NULL; /* Shouldn't happen */
importer = PyDict_GetItemWithError(path_importer_cache, p); if (PyDict_GetItemRef(path_importer_cache, p, &importer) != 0) {
if (importer != NULL || _PyErr_Occurred(tstate)) { // found or error
return Py_XNewRef(importer); return importer;
} }
// not found
/* set path_importer_cache[p] to None to avoid recursion */ /* set path_importer_cache[p] to None to avoid recursion */
if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0) if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
return NULL; return NULL;
@ -2565,7 +2565,7 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
{ {
PyObject *abs_name; PyObject *abs_name;
PyObject *package = NULL; PyObject *package = NULL;
PyObject *spec; PyObject *spec = NULL;
Py_ssize_t last_dot; Py_ssize_t last_dot;
PyObject *base; PyObject *base;
int level_up; int level_up;
@ -2578,20 +2578,18 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
_PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict"); _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict");
goto error; goto error;
} }
package = PyDict_GetItemWithError(globals, &_Py_ID(__package__)); if (PyDict_GetItemRef(globals, &_Py_ID(__package__), &package) < 0) {
if (package == Py_None) {
package = NULL;
}
else if (package == NULL && _PyErr_Occurred(tstate)) {
goto error; goto error;
} }
spec = PyDict_GetItemWithError(globals, &_Py_ID(__spec__)); if (package == Py_None) {
if (spec == NULL && _PyErr_Occurred(tstate)) { Py_DECREF(package);
package = NULL;
}
if (PyDict_GetItemRef(globals, &_Py_ID(__spec__), &spec) < 0) {
goto error; goto error;
} }
if (package != NULL) { if (package != NULL) {
Py_INCREF(package);
if (!PyUnicode_Check(package)) { if (!PyUnicode_Check(package)) {
_PyErr_SetString(tstate, PyExc_TypeError, _PyErr_SetString(tstate, PyExc_TypeError,
"package must be a string"); "package must be a string");
@ -2635,16 +2633,15 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
goto error; goto error;
} }
package = PyDict_GetItemWithError(globals, &_Py_ID(__name__)); if (PyDict_GetItemRef(globals, &_Py_ID(__name__), &package) < 0) {
goto error;
}
if (package == NULL) { if (package == NULL) {
if (!_PyErr_Occurred(tstate)) { _PyErr_SetString(tstate, PyExc_KeyError,
_PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals");
"'__name__' not in globals");
}
goto error; goto error;
} }
Py_INCREF(package);
if (!PyUnicode_Check(package)) { if (!PyUnicode_Check(package)) {
_PyErr_SetString(tstate, PyExc_TypeError, _PyErr_SetString(tstate, PyExc_TypeError,
"__name__ must be a string"); "__name__ must be a string");
@ -2692,6 +2689,7 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
} }
} }
Py_XDECREF(spec);
base = PyUnicode_Substring(package, 0, last_dot); base = PyUnicode_Substring(package, 0, last_dot);
Py_DECREF(package); Py_DECREF(package);
if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) { if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
@ -2708,6 +2706,7 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
"with no known parent package"); "with no known parent package");
error: error:
Py_XDECREF(spec);
Py_XDECREF(package); Py_XDECREF(package);
return NULL; return NULL;
} }