222 def _trace_include( self, frame, event, arg ):
223 fn = frame.f_code.co_filename
224 if fn.find ('importlib._bootstrap') >= 0:
225 return self._trace_include
226
227 if not os.path.exists( fn ):
228 fn = FindFile( basename2( fn ), sys.path, os.R_OK )
229
230 if not ( fn and self._doTrace( fn ) ):
231 return self._trace_include
232
233 if fn not in _filecache:
234
235 f = frame.f_back
236 while f is not None:
237 try:
238 if 'import' in _filecache[ f.f_code.co_filename ][ f.f_lineno ]:
239 return self._trace_include
240 except Exception:
241 pass
242 f = f.f_back
243 del f
244
245
246 _filecache[ fn ] = open( fn, 'r' ).readlines() or '\n'
247 _linecache[ fn ] = sys.maxsize, self.fid
248 self.fid += 1
249
250 lno = frame.f_lineno
251 aln = lno - 1 > 0 and lno - 1 or 0
252
253 ncur, fid = _linecache[ fn ]
254 buf = _filecache[ fn ]
255
256 if self._fcurrent != fn:
257 self.msg.info( 'continued trace of "%s"', basename2( fn ) )
258 self._fcurrent = fn
259
260 if event == 'line':
261 for i in range( ncur, aln ):
262 self._oneline( fid, i, silentMarker, buf )
263
264 if ncur <= aln:
265 self._oneline( fid, aln, activeMarker, buf )
266 elif 0 <= aln:
267 self._oneline( fid, aln, tracedMarker, buf )
268
269 if ncur < lno:
270 _linecache[ fn ] = lno, fid
271
272 elif event == 'call':
273 if lno < ncur:
274 self._oneline( fid, aln, callMarker, buf )
275
276 elif event == 'return':
277 if lno < ncur:
278 fln = frame.f_code.co_firstlineno - 1
279 self._oneline( fid, fln, returnMarker, None )
280
281 return self._trace_include
282