Uh oh!
There was an error while loading. Please reload this page.
gh-124552 : Improve the accuracy of possible breakpoint check in bdb - #124553
Conversation
iritkatriel
commented
Sep 26, 2024
This needs a test. |
| self.code_lineno[code] = set() | ||
| for _, _, lineno in code.co_lines(): | ||
| self.code_lineno[code].add(lineno) |
There was a problem hiding this comment.
| self.code_lineno[code] =set() | |
| for_, _, linenoincode.co_lines(): | |
| self.code_lineno[code].add(lineno) | |
| self.code_lineno[code] =set([lnofor_, _, lnoincode.co_lines()]) |
gaogaotiantian
commented
Sep 26, 2024
Do you think a test that directly tests |
gaogaotiantian
commented
Sep 27, 2024
I added a test for |
terryjreedy
commented
Sep 28, 2024
I am testing this with IDLE's bdb-based debugger now. |
terryjreedy
commented
Sep 28, 2024
No (new) problems found. Breakpoints at top level and in def still work. |
gaogaotiantian
commented
Sep 28, 2024
Thanks @terryjreedy for confirming this. #124533 might be another interesting one to test. |
| return False | ||
| if code not in self.code_lineno: | ||
| self.code_lineno[code] = set(lineno for _, _, lineno in code.co_lines()) | ||
| return lineno in self.code_lineno[frame.f_code] |
There was a problem hiding this comment.
| returnlinenoinself.code_lineno[frame.f_code] | |
| returnlinenoinself.code_lineno[code] |
| self.frame_returning = None | ||
| self.trace_opcodes = False | ||
| self.enterframe = None | ||
| self.code_lineno = weakref.WeakKeyDictionary() |
There was a problem hiding this comment.
| self.code_lineno=weakref.WeakKeyDictionary() | |
| self.code_linenos=weakref.WeakKeyDictionary() |
Uh oh!
There was an error while loading. Please reload this page.
| @@ -275,7 +280,23 @@ def do_clear(self, arg): | |||
| def break_anywhere(self, frame): | |||
| """Return True if there is any breakpoint for frame's filename. | |||
There was a problem hiding this comment.
this comment needs updating (it's not just filename now).
…nQKNM.rst Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
| if self.stopframe and frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS: | ||
| # It's possible to trigger a StopIteration exception in | ||
| # the caller so we must set the trace function in the caller | ||
| self._set_caller_tracefunc(frame) |
There was a problem hiding this comment.
There is a hidden bug which was exposed by the change of break_anywhere. There's a test case of bdb testing raising StopIteration in a generator. It passed because break_anywhere always return True when the function was defined in the same file, which always sets the trace function on the caller because it is in the same file. That coincidence hide the bug where returning from a generator should stop in the caller. There's a similar call in line 177 - that's for the normal return case from #118979 - it's also my fix to a similar case.
Now we check whether the line number is in the code object with
co_lines()so we can have an accurate answer.A bug needs to be fixed for generators. This is not caused by the new feature, but exposed. I put those together because the changes are very small. I can separate those if that's desired.