docs: def sourcelines(self):
          """The sourcecode of the file as list of unicode strings."""
          # get sourcecode from loader or file
          source = None
          if self.loader is not None:
              try:
                  if hasattr(self.loader, 'get_source'):
                      source = self.loader.get_source(self.module)
                  elif hasattr(self.loader, 'get_source_by_code'):
                      source = self.loader.get_source_by_code(self.code)
              except Exception:
                  # we munch the exception so that we don't cause troubles
                  # if the loader is broken.
                  pass
  
          if source is None:
              try:
                  f = open(self.filename)
              except IOError:
                  return []
              try:
                  source = f.read()
              finally:
                  f.close()
  
          # already unicode?  return right away
          if isinstance(source, str):
              return source.splitlines()
  
          # yes. it should be ascii, but we don't want to reject too many
          # characters in the debugger if something breaks
          charset = 'utf-8'
          if source.startswith(UTF8_COOKIE):
              source = source[3:]
          else:
              for idx, match in enumerate(_line_re.finditer(source)):
                  match = _line_re.search(match.group())
                  if match is not None:
                      charset = match.group(1)
                      break
                  if idx > 1:
                      break
  
          # on broken cookies we fall back to utf-8 too
          try:
              codecs.lookup(charset)
          except LookupError:
              charset = 'utf-8'
  
          return source.decode(charset, 'replace').splitlines()