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;
}
PyObject *layout_func = PyImport_ImportModuleAttrString("ctypes._layout",
- "get_layout");
+ "get_layout");
if (!layout_func) {
goto error;
}
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
// 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;
}
}
result = Py_NewRef(Py_None);
finally:
- Py_XDECREF(test_module);
Py_XDECREF(test_func);
return result;
}
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;
}
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();
}
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();
if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
_PyRuntime.signals.unhandled_keyboard_interrupt = 1;
}
- Py_DECREF(runpy);
Py_DECREF(runmodule);
Py_DECREF(module);
Py_DECREF(runargs);
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;
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;
}
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);
}
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;
Py_DECREF(interactive_filename);
- Py_DECREF(linecache_module);
Py_XDECREF(print_tb_func);
Py_XDECREF(result);
if (!result) {