STINNER Victor <[email protected]> added the comment:
I looked how Cython uses PyFrameObject:
* read f_lasti
* read/write f_back
* write f_lineno
* read f_localsplus
* read/write f_trace
Details:
* Cython/Debugger/libpython.py: code using the Python API of gdb to read
PyFrameObject.f_lasti. It it used to compute the line number of a frame. The
python_step() function puts a watch point on "f->f_lasti".
* Cython/Utility/Coroutine.c: set PyFrameObject.f_back using "f->f_back =
tstate->frame;" and "Py_CLEAR(f->f_back);".
* Cython/Utility/ModuleSetupCode.c, __Pyx_PyFrame_SetLineNumber(): set
PyFrameObject.f_lineno member. The limited C API flavor of this function does
nothing, since this member cannot be set in the limited C API.
* Cython/Utility/ObjectHandling.c, __Pyx_PyFrame_GetLocalsplus(): complex
implementation to access PyFrameObject.f_localsplus:
// Initialised by module init code.
static size_t __pyx_pyframe_localsplus_offset = 0;
#include "frameobject.h"
// This is the long runtime version of
// #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus)
// offsetof(PyFrameObject, f_localsplus) differs between regular C-Python and
Stackless Python.
// Therefore the offset is computed at run time from
PyFrame_type.tp_basicsize. That is feasible,
// because f_localsplus is the last field of PyFrameObject (checked by
Py_BUILD_ASSERT_EXPR below).
#define __Pxy_PyFrame_Initialize_Offsets() \
((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) ==
offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject,
f_localsplus)), \
(void)(__pyx_pyframe_localsplus_offset =
((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject,
f_localsplus)))
#define __Pyx_PyFrame_GetLocalsplus(frame) \
(assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) +
__pyx_pyframe_localsplus_offset))
* Cython/Utility/Profile.c, __Pyx_TraceLine(): read PyFrameObject.f_trace.
* Cython/Utility/Profile.c, __Pyx_TraceSetupAndCall(): set
PyFrameObject.f_trace.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue40421>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com