diff options
author | Phillip J. Eby <pje@telecommunity.com> | 2005-08-02 00:46:46 (GMT) |
---|---|---|
committer | Phillip J. Eby <pje@telecommunity.com> | 2005-08-02 00:46:46 (GMT) |
commit | 0d6615fd29063bdaccb13e1fbae542fb666d8728 (patch) | |
tree | 0f18d41e2cb8831c9d244ab6586f9f8377592c67 /Python/ceval.c | |
parent | d794666048510deca0d4987a4c74d0fca85be411 (diff) | |
download | cpython-0d6615fd29063bdaccb13e1fbae542fb666d8728.zip cpython-0d6615fd29063bdaccb13e1fbae542fb666d8728.tar.gz cpython-0d6615fd29063bdaccb13e1fbae542fb666d8728.tar.bz2 |
PEP 342 implementation. Per Guido's comments, the generator throw()
method still needs to support string exceptions, and allow None for the
third argument. Documentation updates are needed, too.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 1103dfc..d311537 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -499,7 +499,14 @@ PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals) /* Interpreter main loop */ PyObject * -PyEval_EvalFrame(PyFrameObject *f) +PyEval_EvalFrame(PyFrameObject *f) { + /* This is for backward compatibility with extension modules that + used this API; core interpreter code should call PyEval_EvalFrameEx() */ + return PyEval_EvalFrameEx(f, 0); +} + +PyObject * +PyEval_EvalFrameEx(PyFrameObject *f, int throw) { #ifdef DXPAIRS int lastopcode = 0; @@ -747,6 +754,11 @@ PyEval_EvalFrame(PyFrameObject *f) x = Py_None; /* Not a reference, just anything non-NULL */ w = NULL; + if (throw) { /* support for generator.throw() */ + why = WHY_EXCEPTION; + goto on_error; + } + for (;;) { #ifdef WITH_TSC if (inst1 == 0) { @@ -2733,7 +2745,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, return PyGen_New(f); } - retval = PyEval_EvalFrame(f); + retval = PyEval_EvalFrameEx(f,0); fail: /* Jump here from prelude on failure */ @@ -3636,7 +3648,7 @@ fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk) Py_INCREF(*stack); fastlocals[i] = *stack++; } - retval = PyEval_EvalFrame(f); + retval = PyEval_EvalFrameEx(f,0); assert(tstate != NULL); ++tstate->recursion_depth; Py_DECREF(f); |