summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-10-18 18:04:18 -0400
committerNed Batchelder <ned@nedbatchelder.com>2021-10-18 18:04:18 -0400
commit8021196662dcadf161cbeaebb3be4b0392b51803 (patch)
treed8400d8e89e4998b5fd181696ab9675c89b397ff
parent50a0e37ad2e7a5ec655a797f0688f616c8b1a56f (diff)
downloadpython-coveragepy-git-8021196662dcadf161cbeaebb3be4b0392b51803.tar.gz
refactor: no need for specialized pyexpat code anymore
The pyexpat bug that plagued us was fixed in Python 3.4: https://bugs.python.org/issue22462 We no longer need the code that adapted to it. The test will remain, couldn't hurt.
-rw-r--r--coverage/ctracer/stats.h2
-rw-r--r--coverage/ctracer/tracer.c79
-rw-r--r--coverage/ctracer/tracer.h4
-rw-r--r--coverage/inorout.py5
-rw-r--r--coverage/pytracer.py16
5 files changed, 0 insertions, 106 deletions
diff --git a/coverage/ctracer/stats.h b/coverage/ctracer/stats.h
index 05173369..75e5cc74 100644
--- a/coverage/ctracer/stats.h
+++ b/coverage/ctracer/stats.h
@@ -17,10 +17,8 @@ typedef struct Stats {
#if COLLECT_STATS
unsigned int lines;
unsigned int returns;
- unsigned int exceptions;
unsigned int others;
unsigned int files;
- unsigned int missed_returns;
unsigned int stack_reallocs;
unsigned int errors;
unsigned int pycalls;
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c
index cf5bebb1..8b8953aa 100644
--- a/coverage/ctracer/tracer.c
+++ b/coverage/ctracer/tracer.c
@@ -296,48 +296,6 @@ error:
*/
static int
-CTracer_check_missing_return(CTracer *self, PyFrameObject *frame)
-{
- int ret = RET_ERROR;
-
- if (self->last_exc_back) {
- if (frame == self->last_exc_back) {
- /* Looks like someone forgot to send a return event. We'll clear
- the exception state and do the RETURN code here. Notice that the
- frame we have in hand here is not the correct frame for the RETURN,
- that frame is gone. Our handling for RETURN doesn't need the
- actual frame, but we do log it, so that will look a little off if
- you're looking at the detailed log.
-
- If someday we need to examine the frame when doing RETURN, then
- we'll need to keep more of the missed frame's state.
- */
- STATS( self->stats.missed_returns++; )
- if (CTracer_set_pdata_stack(self) < 0) {
- goto error;
- }
- if (self->pdata_stack->depth >= 0) {
- if (self->tracing_arcs && self->pcur_entry->file_data) {
- if (CTracer_record_pair(self, self->pcur_entry->last_line, -self->last_exc_firstlineno) < 0) {
- goto error;
- }
- }
- SHOWLOG(PyFrame_GetLineNumber(frame), MyFrame_GetCode(frame)->co_filename, "missedreturn");
- self->pdata_stack->depth--;
- self->pcur_entry = &self->pdata_stack->stack[self->pdata_stack->depth];
- }
- }
- self->last_exc_back = NULL;
- }
-
- ret = RET_OK;
-
-error:
-
- return ret;
-}
-
-static int
CTracer_handle_call(CTracer *self, PyFrameObject *frame)
{
int ret = RET_ERROR;
@@ -773,30 +731,6 @@ error:
return ret;
}
-static int
-CTracer_handle_exception(CTracer *self, PyFrameObject *frame)
-{
- /* Some code (Python 2.3, and pyexpat anywhere) fires an exception event
- without a return event. To detect that, we'll keep a copy of the
- parent frame for an exception event. If the next event is in that
- frame, then we must have returned without a return event. We can
- synthesize the missing event then.
-
- Python itself fixed this problem in 2.4. Pyexpat still has the bug.
- I've reported the problem with pyexpat as http://bugs.python.org/issue6359 .
- If it gets fixed, this code should still work properly. Maybe some day
- the bug will be fixed everywhere coverage.py is supported, and we can
- remove this missing-return detection.
-
- More about this fix: https://nedbatchelder.com/blog/200907/a_nasty_little_bug.html
- */
- STATS( self->stats.exceptions++; )
- self->last_exc_back = frame->f_back;
- self->last_exc_firstlineno = MyFrame_GetCode(frame)->co_firstlineno;
-
- return RET_OK;
-}
-
/*
* The Trace Function
*/
@@ -837,11 +771,6 @@ CTracer_trace(CTracer *self, PyFrameObject *frame, int what, PyObject *arg_unuse
Py_DECREF(ascii);
#endif
- /* See below for details on missing-return detection. */
- if (CTracer_check_missing_return(self, frame) < 0) {
- goto error;
- }
-
self->activity = TRUE;
switch (what) {
@@ -863,12 +792,6 @@ CTracer_trace(CTracer *self, PyFrameObject *frame, int what, PyObject *arg_unuse
}
break;
- case PyTrace_EXCEPTION:
- if (CTracer_handle_exception(self, frame) < 0) {
- goto error;
- }
- break;
-
default:
STATS( self->stats.others++; )
break;
@@ -1050,10 +973,8 @@ CTracer_get_stats(CTracer *self, PyObject *args_unused)
"calls", self->stats.calls,
"lines", self->stats.lines,
"returns", self->stats.returns,
- "exceptions", self->stats.exceptions,
"others", self->stats.others,
"files", self->stats.files,
- "missed_returns", self->stats.missed_returns,
"stack_reallocs", self->stats.stack_reallocs,
"stack_alloc", self->pdata_stack->alloc,
"errors", self->stats.errors,
diff --git a/coverage/ctracer/tracer.h b/coverage/ctracer/tracer.h
index fbbfa202..65d748ca 100644
--- a/coverage/ctracer/tracer.h
+++ b/coverage/ctracer/tracer.h
@@ -60,10 +60,6 @@ typedef struct CTracer {
/* The current file's data stack entry. */
DataStackEntry * pcur_entry;
- /* The parent frame for the last exception event, to fix missing returns. */
- PyFrameObject * last_exc_back;
- int last_exc_firstlineno;
-
Stats stats;
} CTracer;
diff --git a/coverage/inorout.py b/coverage/inorout.py
index 2c216ea9..6bdac06e 100644
--- a/coverage/inorout.py
+++ b/coverage/inorout.py
@@ -349,11 +349,6 @@ class InOrOut:
# can't do anything with the data later anyway.
return nope(disp, "not a real file name")
- # pyexpat does a dumb thing, calling the trace function explicitly from
- # C code with a C file name.
- if re.search(r"[/\\]Modules[/\\]pyexpat.c", filename):
- return nope(disp, "pyexpat lies about itself")
-
# Jython reports the .class file to the tracer, use the source file.
if filename.endswith("$py.class"):
filename = filename[:-9] + ".py"
diff --git a/coverage/pytracer.py b/coverage/pytracer.py
index d4a0b748..0a362591 100644
--- a/coverage/pytracer.py
+++ b/coverage/pytracer.py
@@ -55,8 +55,6 @@ class PyTracer:
self.started_context = False
self.data_stack = []
- self.last_exc_back = None
- self.last_exc_firstlineno = 0
self.thread = None
self.stopped = False
self._activity = False
@@ -118,17 +116,6 @@ class PyTracer:
)
return None
- if self.last_exc_back:
- if frame == self.last_exc_back:
- # Someone forgot a return event.
- if self.trace_arcs and self.cur_file_data:
- pair = (self.last_line, -self.last_exc_firstlineno)
- self.cur_file_data.add(pair)
- self.cur_file_data, self.cur_file_name, self.last_line, self.started_context = (
- self.data_stack.pop()
- )
- self.last_exc_back = None
-
# if event != 'call' and frame.f_code.co_filename != self.cur_file_name:
# self.log("---\n*", frame.f_code.co_filename, self.cur_file_name, frame.f_lineno)
@@ -204,9 +191,6 @@ class PyTracer:
if self.started_context:
self.context = None
self.switch_context(None)
- elif event == 'exception':
- self.last_exc_back = frame.f_back
- self.last_exc_firstlineno = frame.f_code.co_firstlineno
return self._trace
def start(self):