Skip to content

Commit

Permalink
pythongh-128911: Use PyImport_ImportModuleAttr() function
Browse files Browse the repository at this point in the history
* Replace PyImport_ImportModule() + PyObject_GetAttr() with
  PyImport_ImportModuleAttr().
* Replace PyImport_ImportModule() + PyObject_GetAttrString() with
  PyImport_ImportModuleAttrString().
  • Loading branch information
vstinner committed Feb 4, 2025
1 parent 979d766 commit 76ba47e
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 94 deletions.
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
31 changes: 8 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,17 @@ 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;
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
15 changes: 5 additions & 10 deletions PC/_testconsole.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,10 @@ static PyObject *
_testconsole_write_input_impl(PyObject *module, PyObject *file, Py_buffer *s)
/*[clinic end generated code: output=58631a8985426ad3 input=68062f1bb2e52206]*/
{
INPUT_RECORD *rec = NULL;

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

PyTypeObject *winconsoleio_type = (PyTypeObject *)PyObject_GetAttrString(mod, "_WindowsConsoleIO");
Py_DECREF(mod);
PyTypeObject *winconsoleio_type;
winconsoleio_type = (PyTypeObject *)PyImport_ImportModuleAttrString(
"_io",
"_WindowsConsoleIO");
if (winconsoleio_type == NULL) {
return NULL;
}
Expand All @@ -88,7 +83,7 @@ _testconsole_write_input_impl(PyObject *module, PyObject *file, Py_buffer *s)
const wchar_t *p = (const wchar_t *)s->buf;
DWORD size = (DWORD)s->len / sizeof(wchar_t);

rec = (INPUT_RECORD*)PyMem_Calloc(size, sizeof(INPUT_RECORD));
INPUT_RECORD *rec = (INPUT_RECORD*)PyMem_Calloc(size, sizeof(INPUT_RECORD));
if (!rec)
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

0 comments on commit 76ba47e

Please sign in to comment.