gh-120678: pyrepl: Include globals from modules passed with -i (GH-120904)

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
Alex Waygood 2024-07-17 15:18:42 +01:00 committed by GitHub
parent 58753f33e4
commit ac07451116
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 178 additions and 11 deletions

View file

@ -4,6 +4,7 @@
#include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_initconfig.h" // _PyArgv
#include "pycore_interp.h" // _PyInterpreterState.sysdict
#include "pycore_long.h" // _PyLong_GetOne()
#include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0()
#include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
@ -259,6 +260,53 @@ error:
}
static int
pymain_start_pyrepl_no_main(void)
{
int res = 0;
PyObject *pyrepl, *console, *empty_tuple, *kwargs, *console_result;
pyrepl = PyImport_ImportModule("_pyrepl.main");
if (pyrepl == NULL) {
fprintf(stderr, "Could not import _pyrepl.main\n");
res = pymain_exit_err_print();
goto done;
}
console = PyObject_GetAttrString(pyrepl, "interactive_console");
if (console == NULL) {
fprintf(stderr, "Could not access _pyrepl.main.interactive_console\n");
res = pymain_exit_err_print();
goto done;
}
empty_tuple = PyTuple_New(0);
if (empty_tuple == NULL) {
res = pymain_exit_err_print();
goto done;
}
kwargs = PyDict_New();
if (kwargs == NULL) {
res = pymain_exit_err_print();
goto done;
}
if (!PyDict_SetItemString(kwargs, "pythonstartup", _PyLong_GetOne())) {
_PyRuntime.signals.unhandled_keyboard_interrupt = 0;
console_result = PyObject_Call(console, empty_tuple, kwargs);
if (!console_result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
_PyRuntime.signals.unhandled_keyboard_interrupt = 1;
}
if (console_result == NULL) {
res = pymain_exit_err_print();
}
}
done:
Py_XDECREF(console_result);
Py_XDECREF(kwargs);
Py_XDECREF(empty_tuple);
Py_XDECREF(console);
Py_XDECREF(pyrepl);
return res;
}
static int
pymain_run_module(const wchar_t *modname, int set_argv0)
{
@ -549,7 +597,7 @@ pymain_repl(PyConfig *config, int *exitcode)
*exitcode = (run != 0);
return;
}
int run = pymain_run_module(L"_pyrepl", 0);
int run = pymain_start_pyrepl_no_main();
*exitcode = (run != 0);
return;
}