diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2022-05-02 06:44:32 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2022-05-12 08:00:04 -0400 |
commit | 956f0fde6178100925e79d5d894e531e2a73ec2f (patch) | |
tree | d21dff59c7f44614fcb4c9917efca8a0d5f8bd29 /coverage | |
parent | 9097c0dd319d370925a8a4f65da89e19c8cddd65 (diff) | |
download | python-coveragepy-git-956f0fde6178100925e79d5d894e531e2a73ec2f.tar.gz |
fix: fix compilation errors on latest 3.11.0
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/ctracer/tracer.c | 21 | ||||
-rw-r--r-- | coverage/ctracer/util.h | 18 |
2 files changed, 30 insertions, 9 deletions
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c index 80d24b3f..442ea514 100644 --- a/coverage/ctracer/tracer.c +++ b/coverage/ctracer/tracer.c @@ -307,6 +307,9 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) PyObject * plugin = NULL; PyObject * plugin_name = NULL; PyObject * next_tracename = NULL; +#ifdef RESUME + PyObject * pCode = NULL; +#endif /* Borrowed references. */ PyObject * filename = NULL; @@ -526,16 +529,16 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) */ BOOL real_call = FALSE; -#ifdef RESUME // 3.11.0a4 +#ifdef RESUME /* * The current opcode is guaranteed to be RESUME. The argument * determines what kind of resume it is. */ - PyObject * pCode = MyFrame_GetCode(frame)->co_code; - real_call = (PyBytes_AS_STRING(pCode)[MyFrame_lasti(frame) + 1] == 0); + pCode = MyCode_GetCode(MyFrame_GetCode(frame)); + real_call = (PyBytes_AS_STRING(pCode)[MyFrame_GetLasti(frame) + 1] == 0); #else // f_lasti is -1 for a true call, and a real byte offset for a generator re-entry. - real_call = (MyFrame_lasti(frame) < 0); + real_call = (MyFrame_GetLasti(frame) < 0); #endif if (real_call) { @@ -549,6 +552,9 @@ ok: ret = RET_OK; error: +#ifdef RESUME + MyCode_FreeCode(pCode); +#endif Py_XDECREF(next_tracename); Py_XDECREF(disposition); Py_XDECREF(plugin); @@ -689,6 +695,8 @@ CTracer_handle_return(CTracer *self, PyFrameObject *frame) { int ret = RET_ERROR; + PyObject * pCode = NULL; + STATS( self->stats.returns++; ) /* A near-copy of this code is above in the missing-return handler. */ if (CTracer_set_pdata_stack(self) < 0) { @@ -699,8 +707,8 @@ CTracer_handle_return(CTracer *self, PyFrameObject *frame) if (self->pdata_stack->depth >= 0) { if (self->tracing_arcs && self->pcur_entry->file_data) { BOOL real_return = FALSE; - PyObject * pCode = MyFrame_GetCode(frame)->co_code; - int lasti = MyFrame_lasti(frame); + pCode = MyCode_GetCode(MyFrame_GetCode(frame)); + int lasti = MyFrame_GetLasti(frame); Py_ssize_t code_size = PyBytes_GET_SIZE(pCode); unsigned char * code_bytes = (unsigned char *)PyBytes_AS_STRING(pCode); #ifdef RESUME @@ -760,6 +768,7 @@ CTracer_handle_return(CTracer *self, PyFrameObject *frame) error: + MyCode_FreeCode(pCode); return ret; } diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h index 58fa1d49..be49a961 100644 --- a/coverage/ctracer/util.h +++ b/coverage/ctracer/util.h @@ -17,13 +17,17 @@ // to make this work, but it's all I've got until https://bugs.python.org/issue40421 // is resolved. #include <internal/pycore_frame.h> -#define MyFrame_lasti(f) ((f)->f_frame->f_lasti * 2) +#if PY_VERSION_HEX >= 0x030B00A7 +#define MyFrame_GetLasti(f) (PyFrame_GetLasti(f)) +#else +#define MyFrame_GetLasti(f) ((f)->f_frame->f_lasti * 2) +#endif #elif PY_VERSION_HEX >= 0x030A00A7 // The f_lasti field changed meaning in 3.10.0a7. It had been bytes, but // now is instructions, so we need to adjust it to use it as a byte index. -#define MyFrame_lasti(f) ((f)->f_lasti * 2) +#define MyFrame_GetLasti(f) ((f)->f_lasti * 2) #else -#define MyFrame_lasti(f) ((f)->f_lasti) +#define MyFrame_GetLasti(f) ((f)->f_lasti) #endif // Access f_code should be done through a helper starting in 3.9. @@ -33,6 +37,14 @@ #define MyFrame_GetCode(f) ((f)->f_code) #endif +#if PY_VERSION_HEX >= 0x030B00A7 +#define MyCode_GetCode(co) (PyObject_GetAttrString((PyObject *)(co), "co_code")) +#define MyCode_FreeCode(code) Py_XDECREF(code) +#else +#define MyCode_GetCode(co) ((co)->co_code) +#define MyCode_FreeCode(code) +#endif + /* The values returned to indicate ok or error. */ #define RET_OK 0 #define RET_ERROR -1 |