Skip to content
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
48 changes: 37 additions & 11 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ pymain_init(const _PyArgv *args)

/* --- pymain_run_python() ---------------------------------------- */

static int
pymain_check_signals(void)
{
return Py_MakePendingCalls();
}

/* Non-zero if filename, command (-c) or module (-m) is set
on the command line */
static inline int config_run_code(const PyConfig *config)
Expand Down Expand Up @@ -197,17 +203,21 @@ pymain_header(const PyConfig *config)
}


static void
static int
pymain_import_readline(const PyConfig *config)
{
if (pymain_check_signals() < 0) {
return -1;
}

if (config->isolated) {
return;
return 0;
}
if (!config->inspect && config_run_code(config)) {
return;
return 0;
}
if (!isatty(fileno(stdin))) {
return;
return 0;
}

PyObject *mod = PyImport_ImportModule("readline");
Expand All @@ -224,6 +234,7 @@ pymain_import_readline(const PyConfig *config)
else {
Py_DECREF(mod);
}
return 0;
}


Expand Down Expand Up @@ -418,8 +429,7 @@ pymain_run_file_obj(PyObject *program_name, PyObject *filename,
return 1;
}

// Call pending calls like signal handlers (SIGINT)
if (Py_MakePendingCalls() == -1) {
if (pymain_check_signals() < 0) {
fclose(fp);
return pymain_exit_err_print();
}
Expand Down Expand Up @@ -567,8 +577,7 @@ _Py_COMP_DIAG_POP
static int
_pymain_run_repl(PyConfig *config, int startup)
{
/* call pending calls like signal handlers (SIGINT) */
if (Py_MakePendingCalls() == -1) {
if (pymain_check_signals() < 0) {
return pymain_exit_err_print();
}

Expand Down Expand Up @@ -647,13 +656,17 @@ pymain_repl(PyConfig *config, int *exitcode)
static void
pymain_run_python(int *exitcode)
{
int set_running_main = 0;

PyObject *main_importer_path = NULL;
PyInterpreterState *interp = _PyInterpreterState_GET();
/* pymain_run_stdin() modify the config */
PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp);

/* ensure path config is written into global variables */
if (_PyStatus_EXCEPTION(_PyPathConfig_UpdateGlobal(config))) {
PyStatus status = _PyPathConfig_UpdateGlobal(config);
if (_PyStatus_EXCEPTION(status)) {
_PyErr_SetFromPyStatus(status);
goto error;
}

Expand All @@ -675,7 +688,9 @@ pymain_run_python(int *exitcode)
}

// import readline and rlcompleter before script dir is added to sys.path
pymain_import_readline(config);
if (pymain_import_readline(config) < 0) {
goto error;
}

PyObject *path0 = NULL;
if (main_importer_path != NULL) {
Expand Down Expand Up @@ -714,8 +729,13 @@ pymain_run_python(int *exitcode)
pymain_header(config);

_PyInterpreterState_SetRunningMain(interp);
set_running_main = 1;
assert(!PyErr_Occurred());

if (pymain_check_signals() < 0) {
goto error;
}

if (config->run_command) {
*exitcode = pymain_run_command(config->run_command);
}
Expand All @@ -732,14 +752,20 @@ pymain_run_python(int *exitcode)
*exitcode = pymain_run_stdin(config);
}

if (pymain_check_signals() < 0) {
goto error;
}

pymain_repl(config, exitcode);
goto done;

error:
*exitcode = pymain_exit_err_print();

done:
_PyInterpreterState_SetNotRunningMain(interp);
if (set_running_main) {
_PyInterpreterState_SetNotRunningMain(interp);
}
Py_XDECREF(main_importer_path);
}

Expand Down
Loading