docs: def getFileLine(where=-1, targetModule=None):
      """
      Return the filename and line number for the given location.
  
      If where is a negative integer, look for the code entry in the current
      stack that is the given number of frames above this module.
      If where is a function, look for the code entry of the function.
  
      @param where: how many frames to go back up, or function
      @type  where: int (negative) or function
  
      @param targetModule: continue going up the stack until that module is seen
      @type  targetModule: str or None
  
      @return: tuple of (file, line)
      @rtype:  tuple of (str, int)
      """
      co = None
      lineno = None
  
      if isinstance(where, types.FunctionType):
          co = where.func_code
          lineno = co.co_firstlineno
      elif isinstance(where, types.MethodType):
          co = where.im_func.func_code
          lineno = co.co_firstlineno
      else:
          stackFrame = sys._getframe()
  
          while stackFrame:
              co = stackFrame.f_code
              if not co.co_filename in __file__:
                  # wind up the stack according to frame
                  while where < -1:
                      stackFrame = stackFrame.f_back
                      where += 1
                  co = stackFrame.f_code
                  lineno = stackFrame.f_lineno
                  break
              stackFrame = stackFrame.f_back
  
      if not co:
          return "<unknown file>", 0
  
      if targetModule:
          while stackFrame:
              co = stackFrame.f_code
              lineno = stackFrame.f_lineno
              if targetModule in co.co_filename:
                  break
              stackFrame = stackFrame.f_back
  
      return scrubFilename(co.co_filename), lineno