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
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
@@ -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;
2 changes: 1 addition & 1 deletion Modules/_ctypes/stgdict.c
Original file line number Diff line number Diff line change
@@ -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;
}
9 changes: 2 additions & 7 deletions Modules/_testcapi/code.c
Original file line number Diff line number Diff line change
@@ -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
@@ -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;
}
@@ -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;
}
11 changes: 3 additions & 8 deletions Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
@@ -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;
}
36 changes: 13 additions & 23 deletions Modules/main.c
Original file line number Diff line number Diff line change
@@ -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();
@@ -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);
@@ -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;
9 changes: 3 additions & 6 deletions Python/crossinterp.c
Original file line number Diff line number Diff line change
@@ -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;
}
29 changes: 6 additions & 23 deletions Python/pythonrun.c
Original file line number Diff line number Diff line change
@@ -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);
@@ -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;
@@ -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) {
Loading