diff -r 7deeecfc49b3 Objects/genobject.c --- a/Objects/genobject.c Fri Dec 09 18:51:13 2016 +0100 +++ b/Objects/genobject.c Fri Dec 09 18:58:41 2016 +0100 @@ -186,7 +186,7 @@ gen_send_ex(PyGenObject *gen, PyObject * f->f_back = tstate->frame; gen->gi_running = 1; - result = PyEval_EvalFrameEx(f, exc); + result = tstate->interp->eval_frame(f, exc); gen->gi_running = 0; /* Don't keep the reference to f_back any longer than necessary. It diff -r 7deeecfc49b3 Python/ceval.c --- a/Python/ceval.c Fri Dec 09 18:51:13 2016 +0100 +++ b/Python/ceval.c Fri Dec 09 18:58:41 2016 +0100 @@ -4069,7 +4069,7 @@ static PyObject * return gen; } - retval = PyEval_EvalFrameEx(f,0); + retval = tstate->interp->eval_frame(f, 0); fail: /* Jump here from prelude on failure */ @@ -4822,7 +4822,7 @@ static PyObject* _Py_HOT_FUNCTION Py_INCREF(*args); fastlocals[i] = *args++; } - result = PyEval_EvalFrameEx(f,0); + result = tstate->interp->eval_frame(f,0); ++tstate->recursion_depth; Py_DECREF(f); diff -r 7deeecfc49b3 Tools/gdb/libpython.py --- a/Tools/gdb/libpython.py Fri Dec 09 18:51:13 2016 +0100 +++ b/Tools/gdb/libpython.py Fri Dec 09 18:58:41 2016 +0100 @@ -262,7 +262,7 @@ class PyObjectPtr(object): Python, and the precise version of gdb. See e.g. https://bugzilla.redhat.com/show_bug.cgi?id=556975 with - PyEval_EvalFrameEx's "f" + PyEval_EvalFrameDefault's "f" ''' return self._gdbval.is_optimized_out @@ -1450,24 +1450,24 @@ class Frame(object): # We divide frames into: # - "python frames": - # - "bytecode frames" i.e. PyEval_EvalFrameEx + # - "bytecode frames" i.e. PyEval_EvalFrameDefault # - "other python frames": things that are of interest from a python # POV, but aren't bytecode (e.g. GC, GIL) # - everything else def is_python_frame(self): - '''Is this a PyEval_EvalFrameEx frame, or some other important + '''Is this a PyEval_EvalFrameDefault frame, or some other important frame? (see is_other_python_frame for what "important" means in this context)''' - if self.is_evalframeex(): + if self.is_evalframedefault(): return True if self.is_other_python_frame(): return True return False - def is_evalframeex(self): - '''Is this a PyEval_EvalFrameEx frame?''' - if self._gdbframe.name() == 'PyEval_EvalFrameEx': + def is_evalframedefault(self): + '''Is this a _PyEval_EvalFrameDefault frame?''' + if self._gdbframe.name() == '_PyEval_EvalFrameDefault': ''' I believe we also need to filter on the inline struct frame_id.inline_depth, only regarding frames with @@ -1476,7 +1476,7 @@ class Frame(object): So we reject those with type gdb.INLINE_FRAME ''' if self._gdbframe.type() == gdb.NORMAL_FRAME: - # We have a PyEval_EvalFrameEx frame: + # We have a PyEval_EvalFrameDefault frame: return True return False @@ -1545,7 +1545,7 @@ class Frame(object): frame = PyFrameObjectPtr.from_pyobject_ptr(f) if not frame.is_optimized_out(): return frame - # gdb is unable to get the "f" argument of PyEval_EvalFrameEx() + # gdb is unable to get the "f" argument of PyEval_EvalFrameDefault() # because it was "optimized out". Try to get "f" from the frame # of the caller, PyEval_EvalCodeEx(). orig_frame = frame @@ -1587,7 +1587,7 @@ class Frame(object): frame = cls.get_selected_frame() while frame: - if frame.is_evalframeex(): + if frame.is_evalframedefault(): return frame frame = frame.older() @@ -1595,7 +1595,7 @@ class Frame(object): return None def print_summary(self): - if self.is_evalframeex(): + if self.is_evalframedefault(): pyop = self.get_pyop() if pyop: line = pyop.get_truncated_repr(MAX_OUTPUT_LEN) @@ -1614,7 +1614,7 @@ class Frame(object): sys.stdout.write('#%i\n' % self.get_index()) def print_traceback(self): - if self.is_evalframeex(): + if self.is_evalframedefault(): pyop = self.get_pyop() if pyop: pyop.print_traceback() @@ -1665,7 +1665,7 @@ class PyList(gdb.Command): if m: start, end = map(int, m.groups()) - # py-list requires an actual PyEval_EvalFrameEx frame: + # py-list requires an actual PyEval_EvalFrameDefault frame: frame = Frame.get_selected_bytecode_frame() if not frame: print('Unable to locate gdb frame for python bytecode interpreter')