Remove PyTryblock struct (GH-26059) · python/cpython@117bfd2
@@ -95,7 +95,7 @@ static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *);
9595static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg);
9696static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs);
9797static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int);
98-static PyTryBlock get_exception_handler(PyCodeObject *, int);
98+static int get_exception_handler(PyCodeObject *, int, int*, int*, int*);
9999100100#define NAME_ERROR_MSG \
101101"name '%.200s' is not defined"
@@ -4461,21 +4461,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
44614461exception_unwind:
44624462f->f_state = FRAME_UNWINDING;
44634463/* We can't use f->f_lasti here, as RERAISE may have set it */
4464-int lasti = INSTR_OFFSET()-1;
4465-PyTryBlock from_table = get_exception_handler(co, lasti);
4466-if (from_table.b_handler < 0) {
4464+int offset = INSTR_OFFSET()-1;
4465+int level, handler, lasti;
4466+if (get_exception_handler(co, offset, &level, &handler, &lasti) == 0) {
44674467// No handlers, so exit.
44684468break;
44694469 }
447044704471-assert(STACK_LEVEL() >= from_table.b_level);
4472-while (STACK_LEVEL() > from_table.b_level) {
4471+assert(STACK_LEVEL() >= level);
4472+while (STACK_LEVEL() > level) {
44734473PyObject *v = POP();
44744474Py_XDECREF(v);
44754475 }
44764476PyObject *exc, *val, *tb;
4477-int handler = from_table.b_handler;
4478-if (from_table.b_type) {
4477+if (lasti) {
44794478PyObject *lasti = PyLong_FromLong(f->f_lasti);
44804479if (lasti == NULL) {
44814480 goto exception_unwind;
@@ -4811,21 +4810,11 @@ parse_range(unsigned char *p, int *start, int*end)
48114810return p;
48124811}
481348124814-static inline void
4815-parse_block(unsigned char *p, PyTryBlock *block) {
4816-int depth_and_lasti;
4817-p = parse_varint(p, &block->b_handler);
4818-p = parse_varint(p, &depth_and_lasti);
4819-block->b_level = depth_and_lasti >> 1;
4820-block->b_type = depth_and_lasti & 1;
4821-}
4822-48234813#define MAX_LINEAR_SEARCH 40
482448144825-static PyTryBlock
4826-get_exception_handler(PyCodeObject *code, int index)
4815+static int
4816+get_exception_handler(PyCodeObject *code, int index, int *level, int *handler, int *lasti)
48274817{
4828-PyTryBlock res;
48294818unsigned char *start = (unsigned char *)PyBytes_AS_STRING(code->co_exceptiontable);
48304819unsigned char *end = start + PyBytes_GET_SIZE(code->co_exceptiontable);
48314820/* Invariants:
@@ -4837,8 +4826,7 @@ get_exception_handler(PyCodeObject *code, int index)
48374826int offset;
48384827parse_varint(start, &offset);
48394828if (offset > index) {
4840-res.b_handler = -1;
4841-return res;
4829+return 0;
48424830 }
48434831do {
48444832unsigned char * mid = start + ((end-start)>>1);
@@ -4862,13 +4850,16 @@ get_exception_handler(PyCodeObject *code, int index)
48624850 }
48634851scan = parse_varint(scan, &size);
48644852if (start_offset + size > index) {
4865-parse_block(scan, &res);
4866-return res;
4853+scan = parse_varint(scan, handler);
4854+int depth_and_lasti;
4855+parse_varint(scan, &depth_and_lasti);
4856+*level = depth_and_lasti >> 1;
4857+*lasti = depth_and_lasti & 1;
4858+return 1;
48674859 }
48684860scan = skip_to_next_entry(scan, end);
48694861 }
4870-res.b_handler = -1;
4871-return res;
4862+return 0;
48724863}
4873486448744865PyFrameObject *