[Python-checkins] r54900 - in python/branches/bcannon-objcap: Modules/interpretermodule.c interpretermodule.c
brett.cannon
python-checkins at python.org
Sat Apr 21 02:24:07 CEST 2007
Author: brett.cannon
Date: Sat Apr 21 02:24:04 2007
New Revision: 54900
Added:
python/branches/bcannon-objcap/interpretermodule.c
- copied unchanged from r54895, python/branches/bcannon-objcap/Modules/interpretermodule.c
Removed:
python/branches/bcannon-objcap/Modules/interpretermodule.c
Log:
Move interpreter module as it currently does not build and is not needed.
Deleted: /python/branches/bcannon-objcap/Modules/interpretermodule.c
==============================================================================
--- /python/branches/bcannon-objcap/Modules/interpretermodule.c Sat Apr 21 02:24:04 2007
+++ (empty file)
@@ -1,376 +0,0 @@
-#include "Python.h"
-#include "interpreter.h"
-#include "cStringIO.h"
-
-static struct PycStringIO_CAPI* PycStringIO = NULL;
-
-#define PyInterpreter_GET_INTERP(interp) \
- (((PyInterpreterObject *)interp)->istate)
-
-/*
- Destroy the interpreter and dealloc memory.
-*/
-static void
-interpreter_dealloc(PyObject *self)
-{
- PyThreadState *new_tstate = NULL;
- PyThreadState *cur_tstate = NULL;
-
- /* To destory an interpreter using Py_EndInterpreter() it must be the
- currently running interpreter. This means you must temporariy make the
- created interpreter the running interpreter again, destroy it, and then
- swap back to the interpreter that created the interpreter in the first
- place. */
- new_tstate = ((PyInterpreterObject *)self)->tstate;
- cur_tstate = PyThreadState_Swap(new_tstate);
-
- Py_EndInterpreter(new_tstate);
- PyEval_RestoreThread(cur_tstate);
-
- self->ob_type->tp_free(self);
-}
-
-/*
- Create a new interpreter.
-*/
-static PyObject *
-interpreter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- PyInterpreterObject *self;
- PyThreadState *cur_tstate;
-
- self = (PyInterpreterObject *)type->tp_alloc(type, 0);
- if (self == NULL)
- return NULL;
-
- /* Creating a new interpreter swaps out the current one. */
- cur_tstate = PyThreadState_GET();
-
- if (Py_NewInterpreter() == NULL) {
- Py_DECREF(self);
- /* XXX Exception best exception to use here? */
- PyErr_SetString(PyExc_Exception, "sub-interpreter creation failed");
- return NULL;
- }
-
- self->tstate = PyThreadState_Swap(cur_tstate);
- if (self->tstate == NULL) {
- Py_DECREF(self);
- PyErr_SetString(PyExc_Exception, "sub-interpreter swap failed");
- return NULL;
- }
- self->istate = (self->tstate)->interp;
-
- return (PyObject *)self;
-}
-
-/*
- Getter for 'builtins'.
-
- There is not setter because the creation of a new interpreter automatically
- creates the initial execution frame which caches the built-in namespace.
- */
-static PyObject *
-interpreter_builtins(PyObject *self)
-{
- PyObject *builtins = PyInterpreter_GET_INTERP(self)->builtins;
-
- Py_INCREF(builtins);
- return builtins;
-}
-
-/*
- Getter for 'sys_dict'.
-
- There is no setter because the dict gets cached somewhere.
- */
-static PyObject *
-interpreter_sys_dict(PyObject *self)
-{
- PyObject *sys_dict = PyInterpreter_GET_INTERP(self)->sysdict;
-
- Py_INCREF(sys_dict);
- return sys_dict;
-}
-
-/*
- Execute Python source code in the interpreter.
-*/
-static PyObject *
-interpreter_exec(PyInterpreterObject *self, PyObject *arg)
-{
- const char *str_arg = NULL;
- PyThreadState* cur_tstate = NULL;
- PyObject *main_module = NULL;
- PyObject *main_dict = NULL;
- PyObject *result = NULL;
- const char *exc_name = NULL;
-
- if (!PyString_Check(arg)) {
- PyErr_SetString(PyExc_TypeError, "argument must be a string");
- return NULL;
- }
-
- str_arg = PyString_AsString(arg);
- if (!str_arg)
- return NULL;
-
- /* Execute in 'self'. */
- cur_tstate = PyThreadState_Swap(self->tstate);
-
- /* If a previous exception was present, clear it out. */
- if (PyErr_Occurred())
- PyErr_Clear();
-
- /* Code borrowed from PyRun_SimpleStringFlags(). */
- main_module = PyImport_AddModule("__main__");
- if (!main_module) {
- goto back_to_caller;
- }
-
- main_dict = PyModule_GetDict(main_module);
-
- result = PyRun_String(str_arg, Py_file_input, main_dict, main_dict);
-
- if (result) {
- Py_DECREF(result);
- }
- else {
- exc_name = ((PyTypeObject *)PyErr_Occurred())->tp_name;
- }
-
- back_to_caller:
- /* Execute in calling interpreter. */
- PyThreadState_Swap(cur_tstate);
-
- if (!result) {
- PyErr_Format(PyExc_RuntimeError,
- "execution raised during execution (%s)", exc_name);
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *
-redirect_output(PyObject *self, PyObject *args)
-{
- PyObject *py_stdout = NULL;
- PyObject *py_stderr = NULL;
- PyObject *used_stdout_stderr = NULL;
-
- if (!PyArg_ParseTuple(args, "|OO", &py_stdout, &py_stderr))
- return NULL;
-
- if (!py_stdout) {
- /* Argument for NewOutput() copied from PycStringIO->NewInput(). */
- py_stdout = (PycStringIO->NewOutput)(512);
- if (!py_stdout)
- return NULL;
- }
-
- if (!py_stderr) {
- /* Argument for NewOutput() copied from PycStringIO->NewInput(). */
- py_stderr = (PycStringIO->NewOutput)(512);
- if (!py_stderr)
- return NULL;
- }
-
- used_stdout_stderr = PyTuple_New(2);
- if (!used_stdout_stderr)
- return NULL;
-
- if (PyDict_SetItemString(PyInterpreter_GET_INTERP(self)->sysdict, "stdout",
- py_stdout) < 0)
- return NULL;
- if (PyDict_SetItemString(PyInterpreter_GET_INTERP(self)->sysdict, "stderr",
- py_stderr) < 0)
- return NULL;
-
- Py_INCREF(py_stdout);
- Py_INCREF(py_stderr);
- PyTuple_SET_ITEM(used_stdout_stderr, 0, py_stdout);
- PyTuple_SET_ITEM(used_stdout_stderr, 1, py_stderr);
-
- return used_stdout_stderr;
-}
-
-static PyObject *
-exc_matches(PyInterpreterObject *self, PyObject *arg)
-{
- PyThreadState *starting_tstate = NULL;
- PyObject *raised_exc = NULL;
- int result = 0;
-
- /* Can only compare against exception classes or instances. */
- if (!(PyExceptionClass_Check(arg) || PyExceptionInstance_Check(arg))) {
- PyErr_SetString(PyExc_TypeError,
- "argument must be an exception class or instance");
- return NULL;
- }
-
- /* Now executing under 'self'. */
- starting_tstate = PyThreadState_Swap(self->tstate);
-
- raised_exc = PyErr_Occurred();
-
- if (!raised_exc) {
- /* Executing under calling interpreter. */
- PyThreadState_Swap(starting_tstate);
- PyErr_SetString(PyExc_LookupError, "no exception set");
- return NULL;
- }
-
- if (PyErr_GivenExceptionMatches(raised_exc, arg))
- result = 1;
-
- /* Execute under calling interpreter. */
- PyThreadState_Swap(starting_tstate);
-
- if (result)
- Py_RETURN_TRUE;
- else
- Py_RETURN_FALSE;
-}
-
-static PyMethodDef interpreter_methods[] = {
- {"builtins", (PyCFunction)interpreter_builtins, METH_NOARGS,
- "Return the built-in namespace dict."},
- {"sys_dict", (PyCFunction)interpreter_sys_dict, METH_NOARGS,
- "Return the 'sys' module's data dictionary."},
- {"execute", (PyCFunction)interpreter_exec, METH_O,
- "Execute the passed-in string in the interpreter."},
- {"redirect_output", (PyCFunction)redirect_output, METH_VARARGS,
- "Redirect stdout to stderr. Returns tuple of objects used."},
- {"exc_matches", (PyCFunction)exc_matches, METH_O,
- "Check if the raised exception in the interpreter matches the argument"},
- {NULL}
-};
-
-
-/*
- Getter for 'modules'.
-*/
-static PyObject *
-interpreter_get_modules(PyObject *self, void *optional)
-{
- PyObject *modules = PyInterpreter_GET_INTERP(self)->modules;
-
- Py_INCREF(modules);
- return modules;
-}
-
-/*
- Setter for 'modules'.
-
- Assumes no one has stored away a reference to sys.modules . Since sys.modules
- is set during interpreter creation, its reference is not updated unless done so
- explicitly.
-
- One option would have been to take the approach of builtins(), which is to have
- a function that returns the initial dict and thus prevent complete dict
- replacement. But since assigning to sys.modules directly has not effect,
- assuming people would treat sys.modules as something to not store away seemed
- reasonable.
-*/
-static int
-interpreter_set_modules(PyObject *self, PyObject *arg, void *optional)
-{
- PyObject *old_modules = PyInterpreter_GET_INTERP(self)->modules;
-
- if (!PyDict_CheckExact(arg)) {
- PyErr_SetString(PyExc_TypeError,
- "'modules' must be set to a dict");
- return -1;
- }
-
- Py_INCREF(arg);
- Py_DECREF(old_modules);
- PyInterpreter_GET_INTERP(self)->modules = arg;
- PyDict_SetItemString(PyInterpreter_GET_INTERP(self)->sysdict,
- "modules", arg);
-
- return 0;
-}
-
-
-static PyGetSetDef interpreter_getset[] = {
- {"modules", interpreter_get_modules, interpreter_set_modules,
- "The dict used for sys.modules.", NULL},
- {NULL}
-};
-
-
-PyDoc_STRVAR(interpreter_type_doc,
-"XXX\n\
-\n\
-XXX");
-
-static PyTypeObject PyInterpreter_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "interpreterInterpreter", /* tp_name */
- sizeof(PyInterpreterObject), /* tp_basicsize */
- 0, /* tp_itemsize */
- interpreter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT |
- Py_TPFLAGS_BASETYPE, /* tp_flags */
- interpreter_type_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- interpreter_methods, /* tp_methods */
- 0, /* tp_members */
- interpreter_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- interpreter_new, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
-};
-
-
-PyMODINIT_FUNC
-initinterpreter(void)
-{
- PyObject *module;
-
- module = Py_InitModule3("interpreter", NULL,
- "Create other Python interpreters to execute code within.");
- if (module == NULL)
- return;
-
- Py_INCREF(&PyInterpreter_Type);
- if (PyType_Ready(&PyInterpreter_Type) < 0)
- return;
-
- if (PyModule_AddObject(module, "Interpreter",
- (PyObject *)&PyInterpreter_Type) < 0)
- return;
-
- PycString_IMPORT;
- if (!PycStringIO)
- return;
-}
More information about the Python-checkins
mailing list