Skip to content

gh-128911: Use PyImport_ImportModuleAttr() function #129657

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 4 additions & 16 deletions Modules/_ctypes/callbacks.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,31 +551,19 @@ STDAPI DllGetClassObject(REFCLSID rclsid,

long Call_CanUnloadNow(void)
{
PyObject *mod, *func, *result;
long retval;

mod = PyImport_ImportModule("ctypes");
if (!mod) {
/* OutputDebugString("Could not import ctypes"); */
/* We assume that this error can only occur when shutting
down, so we silently ignore it */
PyErr_Clear();
return E_FAIL;
}
/* Other errors cannot be raised, but are printed to stderr */
func = PyObject_GetAttrString(mod, "DllCanUnloadNow");
Py_DECREF(mod);
PyObject *func = PyImport_ImportModuleAttrString("ctypes",
"DllCanUnloadNow");
if (!func) {
goto error;
}

result = _PyObject_CallNoArgs(func);
PyObject *result = _PyObject_CallNoArgs(func);
Py_DECREF(func);
if (!result) {
goto error;
}

retval = PyLong_AsLong(result);
long retval = PyLong_AsLong(result);
if (PyErr_Occurred()) {
Py_DECREF(result);
goto error;
Expand Down
2 changes: 1 addition & 1 deletion Modules/_ctypes/stgdict.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
}

PyObject *layout_func = PyImport_ImportModuleAttrString("ctypes._layout",
"get_layout");
"get_layout");
if (!layout_func) {
goto error;
}
Expand Down
9 changes: 2 additions & 7 deletions Modules/_testcapi/code.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ static PyObject *
test_code_extra(PyObject* self, PyObject *Py_UNUSED(callable))
{
PyObject *result = NULL;
PyObject *test_module = NULL;
PyObject *test_func = NULL;

// Get or initialize interpreter-specific code object storage index
Expand All @@ -62,11 +61,8 @@ test_code_extra(PyObject* self, PyObject *Py_UNUSED(callable))

// Get a function to test with
// This can be any Python function. Use `test.test_misc.testfunction`.
test_module = PyImport_ImportModule("test.test_capi.test_misc");
if (!test_module) {
goto finally;
}
test_func = PyObject_GetAttrString(test_module, "testfunction");
test_func = PyImport_ImportModuleAttrString("test.test_capi.test_misc",
"testfunction");
if (!test_func) {
goto finally;
}
Expand Down Expand Up @@ -102,7 +98,6 @@ test_code_extra(PyObject* self, PyObject *Py_UNUSED(callable))
}
result = Py_NewRef(Py_None);
finally:
Py_XDECREF(test_module);
Py_XDECREF(test_func);
return result;
}
Expand Down
11 changes: 3 additions & 8 deletions Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1057,15 +1057,10 @@ test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
if (ret != -1 || match == 0)
goto error;

PyObject *mod_io = PyImport_ImportModule("_io");
if (mod_io == NULL) {
return NULL;
}

/* bytesiobuf_getbuffer() */
PyTypeObject *type = (PyTypeObject *)PyObject_GetAttrString(
mod_io, "_BytesIOBuffer");
Py_DECREF(mod_io);
PyTypeObject *type = (PyTypeObject *)PyImport_ImportModuleAttrString(
"_io",
"_BytesIOBuffer");
if (type == NULL) {
return NULL;
}
Expand Down
36 changes: 13 additions & 23 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,33 +314,26 @@ pymain_start_pyrepl_no_main(void)
static int
pymain_run_module(const wchar_t *modname, int set_argv0)
{
PyObject *module, *runpy, *runmodule, *runargs, *result;
PyObject *module, *runmodule, *runargs, *result;
if (PySys_Audit("cpython.run_module", "u", modname) < 0) {
return pymain_exit_err_print();
}
runpy = PyImport_ImportModule("runpy");
if (runpy == NULL) {
fprintf(stderr, "Could not import runpy module\n");
return pymain_exit_err_print();
}
runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
runmodule = PyImport_ImportModuleAttrString("runpy",
"_run_module_as_main");
if (runmodule == NULL) {
fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Py_DECREF(runpy);
fprintf(stderr, "Could not import runpy._run_module_as_main\n");
return pymain_exit_err_print();
}
module = PyUnicode_FromWideChar(modname, wcslen(modname));
if (module == NULL) {
fprintf(stderr, "Could not convert module name to unicode\n");
Py_DECREF(runpy);
Py_DECREF(runmodule);
return pymain_exit_err_print();
}
runargs = PyTuple_Pack(2, module, set_argv0 ? Py_True : Py_False);
if (runargs == NULL) {
fprintf(stderr,
"Could not create arguments for runpy._run_module_as_main\n");
Py_DECREF(runpy);
Py_DECREF(runmodule);
Py_DECREF(module);
return pymain_exit_err_print();
Expand All @@ -350,7 +343,6 @@ pymain_run_module(const wchar_t *modname, int set_argv0)
if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
_PyRuntime.signals.unhandled_keyboard_interrupt = 1;
}
Py_DECREF(runpy);
Py_DECREF(runmodule);
Py_DECREF(module);
Py_DECREF(runargs);
Expand Down Expand Up @@ -497,24 +489,22 @@ pymain_run_startup(PyConfig *config, int *exitcode)
static int
pymain_run_interactive_hook(int *exitcode)
{
PyObject *sys, *hook, *result;
sys = PyImport_ImportModule("sys");
if (sys == NULL) {
goto error;
}

hook = PyObject_GetAttrString(sys, "__interactivehook__");
Py_DECREF(sys);
PyObject *hook = PyImport_ImportModuleAttrString("sys",
"__interactivehook__");
if (hook == NULL) {
PyErr_Clear();
return 0;
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
// no sys.__interactivehook__ attribute
PyErr_Clear();
return 0;
}
goto error;
}

if (PySys_Audit("cpython.run_interactivehook", "O", hook) < 0) {
goto error;
}

result = _PyObject_CallNoArgs(hook);
PyObject *result = _PyObject_CallNoArgs(hook);
Py_DECREF(hook);
if (result == NULL) {
goto error;
Expand Down
9 changes: 3 additions & 6 deletions Python/crossinterp.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,12 +368,9 @@ _convert_exc_to_TracebackException(PyObject *exc, PyObject **p_tbexc)
PyObject *create = NULL;

// This is inspired by _PyErr_Display().
PyObject *tbmod = PyImport_ImportModule("traceback");
if (tbmod == NULL) {
return -1;
}
PyObject *tbexc_type = PyObject_GetAttrString(tbmod, "TracebackException");
Py_DECREF(tbmod);
PyObject *tbexc_type = PyImport_ImportModuleAttrString(
"traceback",
"TracebackException");
if (tbexc_type == NULL) {
return -1;
}
Expand Down
29 changes: 6 additions & 23 deletions Python/pythonrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -1108,22 +1108,15 @@ _PyErr_Display(PyObject *file, PyObject *unused, PyObject *value, PyObject *tb)
int unhandled_keyboard_interrupt = _PyRuntime.signals.unhandled_keyboard_interrupt;

// Try first with the stdlib traceback module
PyObject *traceback_module = PyImport_ImportModule("traceback");

if (traceback_module == NULL) {
goto fallback;
}

PyObject *print_exception_fn = PyObject_GetAttrString(traceback_module, "_print_exception_bltin");

PyObject *print_exception_fn = PyImport_ImportModuleAttrString(
"traceback",
"_print_exception_bltin");
if (print_exception_fn == NULL || !PyCallable_Check(print_exception_fn)) {
Py_DECREF(traceback_module);
goto fallback;
}

PyObject* result = PyObject_CallOneArg(print_exception_fn, value);

Py_DECREF(traceback_module);
Py_XDECREF(print_exception_fn);
if (result) {
Py_DECREF(result);
Expand Down Expand Up @@ -1371,27 +1364,18 @@ run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
}

if (interactive_src) {
PyObject *linecache_module = PyImport_ImportModule("linecache");

if (linecache_module == NULL) {
Py_DECREF(co);
Py_DECREF(interactive_filename);
return NULL;
}

PyObject *print_tb_func = PyObject_GetAttrString(linecache_module, "_register_code");

PyObject *print_tb_func = PyImport_ImportModuleAttrString(
"linecache",
"_register_code");
if (print_tb_func == NULL) {
Py_DECREF(co);
Py_DECREF(interactive_filename);
Py_DECREF(linecache_module);
return NULL;
}

if (!PyCallable_Check(print_tb_func)) {
Py_DECREF(co);
Py_DECREF(interactive_filename);
Py_DECREF(linecache_module);
Py_DECREF(print_tb_func);
PyErr_SetString(PyExc_ValueError, "linecache._register_code is not callable");
return NULL;
Expand All @@ -1406,7 +1390,6 @@ run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,

Py_DECREF(interactive_filename);

Py_DECREF(linecache_module);
Py_XDECREF(print_tb_func);
Py_XDECREF(result);
if (!result) {
Expand Down
Loading