@@ -189,6 +189,9 @@ def _get_executable_linenos(code):
189189 return linenos
190190
191191
192+ _executable_linenos_cache = {}
193+
194+
192195class Bdb :
193196 """Generic Python debugger base class.
194197
@@ -683,13 +686,15 @@ def set_break(self, filename, lineno, temporary=False, cond=None,
683686 line = linecache .getline (filename , lineno )
684687 if not line :
685688 return 'Line %s:%d does not exist' % (filename , lineno )
686- source = '' .join (linecache .getlines (filename ))
687- if source :
688- with suppress (SyntaxError ):
689- code = compile (source , filename , 'exec' )
690- executable_lines = _get_executable_linenos (code )
691- if executable_lines and lineno not in executable_lines :
692- return 'Line %d has no code associated with it' % lineno
689+ if filename not in _executable_linenos_cache :
690+ source = '' .join (linecache .getlines (filename ))
691+ if source :
692+ with suppress (SyntaxError ):
693+ code = compile (source , filename , 'exec' )
694+ _executable_linenos_cache [filename ] = _get_executable_linenos (code )
695+ executable_lines = _executable_linenos_cache .get (filename )
696+ if executable_lines and lineno not in executable_lines :
697+ return 'Line %d has no code associated with it' % lineno
693698 self ._add_to_breaks (filename , lineno )
694699 bp = Breakpoint (filename , lineno , temporary , cond , funcname )
695700 # After we set a new breakpoint, we need to search through all frames
0 commit comments