Commit 630924f1 authored by Guido van Rossum's avatar Guido van Rossum

Use Py_NewInterpreter() and friends. Remove saving/restoring of std files.

parent 275558cb
...@@ -192,13 +192,8 @@ static PyObject *the_builtins; ...@@ -192,13 +192,8 @@ static PyObject *the_builtins;
static void static void
init_python() init_python()
{ {
if (the_interp)
return;
Py_Initialize(); /* Initialize the interpreter */
the_builtins = PyEval_GetBuiltins(); /* Get __builtins__ */
PyEval_InitThreads(); /* Create and acquire the interpreter lock */ PyEval_InitThreads(); /* Create and acquire the interpreter lock */
the_tstate = PyEval_SaveThread(); /* Release lock & get thread state */ PyEval_ReleaseLock(); /* Release the lock */
the_interp = the_tstate->interpreter_state; /* Get interp state */
} }
static void * static void *
...@@ -250,25 +245,25 @@ run_interpreter(FILE *input, FILE *output) ...@@ -250,25 +245,25 @@ run_interpreter(FILE *input, FILE *output)
{ {
PyThreadState *tstate; PyThreadState *tstate;
PyObject *new_stdin, *new_stdout; PyObject *new_stdin, *new_stdout;
PyObject *old_stdin, *old_stdout, *old_stderr; PyObject *mainmod, *globals;
PyObject *globals;
char buffer[1000]; char buffer[1000];
char *p, *q; char *p, *q;
int n, end; int n, end;
tstate = PyThreadState_New(the_interp); PyEval_AcquireLock();
PyEval_AcquireThread(tstate); tstate = Py_NewInterpreter();
if (tstate == NULL) {
fprintf(output, "Sorry -- can't create an interpreter\n");
return;
}
globals = PyDict_New(); mainmod = PyImport_AddModule("__main__");
PyDict_SetItemString(globals, "__builtins__", the_builtins); globals = PyModule_GetDict(mainmod);
Py_INCREF(globals);
new_stdin = PyFile_FromFile(input, "<socket-in>", "r", NULL); new_stdin = PyFile_FromFile(input, "<socket-in>", "r", NULL);
new_stdout = PyFile_FromFile(output, "<socket-out>", "w", NULL); new_stdout = PyFile_FromFile(output, "<socket-out>", "w", NULL);
old_stdin = PySys_GetObject("stdin");
old_stdout = PySys_GetObject("stdout");
old_stderr = PySys_GetObject("stderr");
for (n = 1; !PyErr_Occurred(); n++) { for (n = 1; !PyErr_Occurred(); n++) {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
fprintf(output, "%d> ", n); fprintf(output, "%d> ", n);
...@@ -299,10 +294,6 @@ run_interpreter(FILE *input, FILE *output) ...@@ -299,10 +294,6 @@ run_interpreter(FILE *input, FILE *output)
if (end < 0) if (end < 0)
PyErr_Print(); PyErr_Print();
PySys_SetObject("stdin", old_stdin);
PySys_SetObject("stdout", old_stdout);
PySys_SetObject("stderr", old_stderr);
if (end) if (end)
break; break;
} }
...@@ -311,8 +302,8 @@ run_interpreter(FILE *input, FILE *output) ...@@ -311,8 +302,8 @@ run_interpreter(FILE *input, FILE *output)
Py_XDECREF(new_stdin); Py_XDECREF(new_stdin);
Py_XDECREF(new_stdout); Py_XDECREF(new_stdout);
PyEval_ReleaseThread(tstate); Py_EndInterpreter(tstate);
PyThreadState_Delete(tstate); PyEval_ReleaseLock();
fprintf(output, "Goodbye!\n"); fprintf(output, "Goodbye!\n");
} }
...@@ -321,6 +312,9 @@ static int ...@@ -321,6 +312,9 @@ static int
run_command(char *buffer, PyObject *globals) run_command(char *buffer, PyObject *globals)
{ {
PyObject *m, *d, *v; PyObject *m, *d, *v;
fprintf(stderr, "run_command: %s", buffer);
if (strchr(buffer, '\n') == NULL)
fprintf(stderr, "\n");
v = PyRun_String(buffer, Py_single_input, globals, globals); v = PyRun_String(buffer, Py_single_input, globals, globals);
if (v == NULL) { if (v == NULL) {
if (PyErr_Occurred() == PyExc_SystemExit) { if (PyErr_Occurred() == PyExc_SystemExit) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment