Batuhan <batuhanosmantask...@gmail.com> added the comment:
I try to track down this. sys_settrace calls PyEval_SetTrace with trace_trampoline and the function given to it. The trace_trampoline is important because it checks the result and if result is NULL (for example like f() recursion in your code) it sets c_tracefunc and c_traceobj to NULL. It is why it doesnt work. if (result == NULL) { PyEval_SetTrace(NULL, NULL); Py_CLEAR(frame->f_trace); return -1; } We can create a simple reset function for resetting everything and then setting c_tracefunc, c_traceobj variables back to the thread state. https://github.com/isidentical/cpython/commit/3bafbf3a89e09cc573ddbcd13f9334e164f7dd8b But then a set of tests will fail with raw ValueError produced by tracer. class RaisingTraceFuncTestCase(unittest.TestCase): ... def trace(self, frame, event, arg): """A trace function that raises an exception in response to a specific trace event.""" if event == self.raiseOnEvent: raise ValueError # just something that isn't RuntimeError else: return self.trace This should be catched in def run_test_for_event(self, event): try: for i in range(sys.getrecursionlimit() + 1): sys.settrace(self.trace) try: self.f() except ValueError: pass else: self.fail("exception not raised!") except RuntimeError: self.fail("recursion counter not reset") but after resetting, it doesn't work. I'm missing something but i dont know what i'm missing. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue23012> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com