diff options
author | Fred Drake <fdrake@acm.org> | 2002-03-12 14:26:37 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2002-03-12 14:26:37 (GMT) |
commit | 8b68862680852e5886e801843ceee4128fcffaa7 (patch) | |
tree | 33feb9e6ef8e5aceb19fd48fb5bdd16b9fd0d2ef /Lib/hotshot | |
parent | 8f01b680c85853948591c28ceae356760e7c7c33 (diff) | |
download | cpython-8b68862680852e5886e801843ceee4128fcffaa7.zip cpython-8b68862680852e5886e801843ceee4128fcffaa7.tar.gz cpython-8b68862680852e5886e801843ceee4128fcffaa7.tar.bz2 |
Set/update self.cwd properly.
Diffstat (limited to 'Lib/hotshot')
-rw-r--r-- | Lib/hotshot/log.py | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/Lib/hotshot/log.py b/Lib/hotshot/log.py index 55dda21..c95f7f4 100644 --- a/Lib/hotshot/log.py +++ b/Lib/hotshot/log.py @@ -37,7 +37,13 @@ class LogReader: self._reader = _hotshot.logreader(logfn) self._nextitem = self._reader.next self._info = self._reader.info + if self._info.has_key('current-directory'): + self.cwd = self._info['current-directory'] + else: + self.cwd = None self._stack = [] + self._append = self._stack.append + self._pop = self._stack.pop def addinfo(self, key, value): """This method is called for each additional ADD_INFO record. @@ -53,6 +59,28 @@ class LogReader: """ pass + def get_filename(self, fileno): + try: + return self._filemap[fileno] + except KeyError: + raise ValueError, "unknown fileno" + + def get_filenames(self): + return self._filemap.values() + + def get_fileno(self, filename): + filename = os.path.normcase(os.path.normpath(filename)) + for fileno, name in self._filemap.items(): + if name == filename: + return fileno + raise ValueError, "unknown filename" + + def get_funcname(self, fileno, lineno): + try: + return self._funcmap[(fileno, lineno)] + except KeyError: + raise ValueError, "unknown function location" + # Iteration support: # This adds an optional (& ignored) parameter to next() so that the # same bound method can be used as the __getitem__() method -- this @@ -66,28 +94,37 @@ class LogReader: # logreader().next() returns None at the end self._reader.close() raise StopIteration() + + # handle the most common cases first + + if what == WHAT_ENTER: + filename, funcname = self._decode_location(fileno, lineno) + self._append((filename, funcname, lineno)) + return what, (filename, lineno, funcname), tdelta + + if what == WHAT_EXIT: + filename, funcname, lineno = self._pop() + return what, (filename, lineno, funcname), tdelta + + if what == WHAT_LINENO: + filename, funcname, firstlineno = self._stack[-1] + return what, (filename, lineno, funcname), tdelta + if what == WHAT_DEFINE_FILE: - self._filemap[fileno] = tdelta - continue - if what == WHAT_DEFINE_FUNC: + filename = os.path.normcase(os.path.normpath(tdelta)) + self._filemap[fileno] = filename + elif what == WHAT_DEFINE_FUNC: filename = self._filemap[fileno] self._funcmap[(fileno, lineno)] = (filename, tdelta) - continue - if what == WHAT_ADD_INFO: + elif what == WHAT_ADD_INFO: # value already loaded into self.info; call the # overridable addinfo() handler so higher-level code # can pick up the new value + if tdelta == 'current-directory': + self.cwd = lineno self.addinfo(tdelta, lineno) - continue - if what == WHAT_ENTER: - t = self._decode_location(fileno, lineno) - filename, funcname = t - self._stack.append((filename, funcname, lineno)) - elif what == WHAT_EXIT: - filename, funcname, lineno = self._stack.pop() else: - filename, funcname, firstlineno = self._stack[-1] - return what, (filename, lineno, funcname), tdelta + raise ValueError, "unknown event type" if sys.version < "2.2": # Don't add this for newer Python versions; we only want iteration |