diff options
author | Tian Gao <gaogaotiantian@hotmail.com> | 2024-10-18 00:29:11 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 00:29:11 (GMT) |
commit | 77cebb1ce9baac9e01a45d34113c3bea74940d90 (patch) | |
tree | dd94509d50b0bb084b7f4d7adf8aa7e19676900e /Lib | |
parent | 7cf2dbc3cb3ef7be65a98bbfc87246d36d795c82 (diff) | |
download | cpython-77cebb1ce9baac9e01a45d34113c3bea74940d90.zip cpython-77cebb1ce9baac9e01a45d34113c3bea74940d90.tar.gz cpython-77cebb1ce9baac9e01a45d34113c3bea74940d90.tar.bz2 |
gh-125600: Only show stale code warning on source code display commands (#125601)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/pdb.py | 24 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 19 |
2 files changed, 39 insertions, 4 deletions
@@ -402,6 +402,8 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.curframe = self.stack[self.curindex][0] self.set_convenience_variable(self.curframe, '_frame', self.curframe) + self._save_initial_file_mtime(self.curframe) + if self._chained_exceptions: self.set_convenience_variable( self.curframe, @@ -494,9 +496,21 @@ class Pdb(bdb.Bdb, cmd.Cmd): except KeyboardInterrupt: self.message('--KeyboardInterrupt--') + def _save_initial_file_mtime(self, frame): + """save the mtime of the all the files in the frame stack in the file mtime table + if they haven't been saved yet.""" + while frame: + filename = frame.f_code.co_filename + if filename not in self._file_mtime_table: + try: + self._file_mtime_table[filename] = os.path.getmtime(filename) + except Exception: + pass + frame = frame.f_back + def _validate_file_mtime(self): - """Check if the source file of the current frame has been modified since - the last time we saw it. If so, give a warning.""" + """Check if the source file of the current frame has been modified. + If so, give a warning and reset the modify time to current.""" try: filename = self.curframe.f_code.co_filename mtime = os.path.getmtime(filename) @@ -506,7 +520,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): mtime != self._file_mtime_table[filename]): self.message(f"*** WARNING: file '{filename}' was edited, " "running stale code until the program is rerun") - self._file_mtime_table[filename] = mtime + self._file_mtime_table[filename] = mtime # Called before loop, handles display expressions # Set up convenience variable containers @@ -836,7 +850,6 @@ class Pdb(bdb.Bdb, cmd.Cmd): a breakpoint command list definition. """ if not self.commands_defining: - self._validate_file_mtime() if line.startswith('_pdbcmd'): command, arg, line = self.parseline(line) if hasattr(self, command): @@ -980,6 +993,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): def _pdbcmd_print_frame_status(self, arg): self.print_stack_trace(0) + self._validate_file_mtime() self._show_display() def _pdbcmd_silence_frame_status(self, arg): @@ -1861,6 +1875,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.message('[EOF]') except KeyboardInterrupt: pass + self._validate_file_mtime() do_l = do_list def do_longlist(self, arg): @@ -1879,6 +1894,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.error(err) return self._print_lines(lines, lineno, breaklist, self.curframe) + self._validate_file_mtime() do_ll = do_longlist def do_source(self, arg): diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 8136c59..7e6f276 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3711,6 +3711,25 @@ def bœr(): self.assertIn("WARNING:", stdout) self.assertIn("was edited", stdout) + def test_file_modified_and_immediately_restarted(self): + script = """ + print("hello") + """ + + # the time.sleep is needed for low-resolution filesystems like HFS+ + commands = """ + filename = $_frame.f_code.co_filename + f = open(filename, "w") + f.write("print('goodbye')") + import time; time.sleep(1) + f.close() + restart + """ + + stdout, stderr = self.run_pdb_script(script, commands) + self.assertNotIn("WARNING:", stdout) + self.assertNotIn("was edited", stdout) + def test_file_modified_after_execution_with_multiple_instances(self): # the time.sleep is needed for low-resolution filesystems like HFS+ script = """ |