From 27d63678a31f1adcf5f2f0f9f88d6b78e93a9c52 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 15 Jun 2008 20:09:12 +0000 Subject: improvements to the fix for #3114 keep the tstate consistent and a better test --- Python/ceval.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'Python') diff --git a/Python/ceval.c b/Python/ceval.c index 4b1478433b..ec279bf339 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -699,29 +699,39 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) } #define UNWIND_EXCEPT_HANDLER(b) \ - assert(STACK_LEVEL() >= (b)->b_level + 3); \ - while (STACK_LEVEL() > (b)->b_level + 3) { \ - PyObject *v = POP(); \ - Py_XDECREF(v); \ - } \ - Py_CLEAR(tstate->exc_type); \ - Py_CLEAR(tstate->exc_value); \ - Py_CLEAR(tstate->exc_traceback); \ - tstate->exc_type = POP(); \ - tstate->exc_value = POP(); \ - tstate->exc_traceback = POP(); + { \ + PyObject *type, *value, *traceback; \ + assert(STACK_LEVEL() >= (b)->b_level + 3); \ + while (STACK_LEVEL() > (b)->b_level + 3) { \ + value = POP(); \ + Py_XDECREF(value); \ + } \ + type = tstate->exc_type; \ + value = tstate->exc_value; \ + traceback = tstate->exc_traceback; \ + tstate->exc_type = POP(); \ + tstate->exc_value = POP(); \ + tstate->exc_traceback = POP(); \ + Py_XDECREF(type); \ + Py_XDECREF(value); \ + Py_XDECREF(traceback); \ + } #define SAVE_EXC_STATE() \ { \ + PyObject *type, *value, *traceback; \ Py_XINCREF(tstate->exc_type); \ Py_XINCREF(tstate->exc_value); \ Py_XINCREF(tstate->exc_traceback); \ - Py_CLEAR(f->f_exc_type); \ - Py_CLEAR(f->f_exc_value); \ - Py_CLEAR(f->f_exc_traceback); \ + type = f->f_exc_type; \ + value = f->f_exc_value; \ + traceback = f->f_exc_traceback; \ f->f_exc_type = tstate->exc_type; \ f->f_exc_value = tstate->exc_value; \ f->f_exc_traceback = tstate->exc_traceback; \ + Py_XDECREF(type); \ + Py_XDECREF(value); \ + Py_XDECREF(traceback); \ } #define SWAP_EXC_STATE() \ -- cgit v1.2.1