diff options
author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-09-13 18:14:34 +0000 |
---|---|---|
committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-09-13 18:14:34 +0000 |
commit | 4d7701729caae30312689f6630c453a5b8cdacbd (patch) | |
tree | e1221b525de83a9b3f449ae461f9d9c11f3762eb /Lib/trace.py | |
parent | dc69e7217a78dfbc3586f07920a4c6967baaa275 (diff) | |
download | cpython-4d7701729caae30312689f6630c453a5b8cdacbd.tar.gz cpython-4d7701729caae30312689f6630c453a5b8cdacbd.zip |
Issue #9315: Fix for the trace module to record correct class name
when tracing methods. Unit tests. Patch by Eli Bendersky.
Diffstat (limited to 'Lib/trace.py')
-rw-r--r-- | Lib/trace.py | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/Lib/trace.py b/Lib/trace.py index 7fffe8685c5..969b3961d07 100644 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -57,7 +57,7 @@ import threading import time import token import tokenize -import types +import inspect import gc import pickle @@ -395,7 +395,7 @@ def find_lines(code, strs): # and check the constants for references to other code objects for c in code.co_consts: - if isinstance(c, types.CodeType): + if inspect.iscode(c): # find another code object, so recurse into it linenos.update(find_lines(c, strs)) return linenos @@ -544,7 +544,7 @@ class Trace: ## use of gc.get_referrers() was suggested by Michael Hudson # all functions which refer to this code object funcs = [f for f in gc.get_referrers(code) - if hasattr(f, "__doc__")] + if inspect.isfunction(f)] # require len(func) == 1 to avoid ambiguity caused by calls to # new.function(): "In the face of ambiguity, refuse the # temptation to guess." @@ -556,17 +556,13 @@ class Trace: if hasattr(c, "__bases__")] if len(classes) == 1: # ditto for new.classobj() - clsname = str(classes[0]) + clsname = classes[0].__name__ # cache the result - assumption is that new.* is # not called later to disturb this relationship # _caller_cache could be flushed if functions in # the new module get called. self._caller_cache[code] = clsname if clsname is not None: - # final hack - module name shows up in str(cls), but we've already - # computed module name, so remove it - clsname = clsname.split(".")[1:] - clsname = ".".join(clsname) funcname = "%s.%s" % (clsname, funcname) return filename, modulename, funcname |