summaryrefslogtreecommitdiffstats
path: root/Lib/trace.py
diff options
context:
space:
mode:
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-09-13 18:14:34 (GMT)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-09-13 18:14:34 (GMT)
commit4d7701729caae30312689f6630c453a5b8cdacbd (patch)
treee1221b525de83a9b3f449ae461f9d9c11f3762eb /Lib/trace.py
parentdc69e7217a78dfbc3586f07920a4c6967baaa275 (diff)
downloadcpython-4d7701729caae30312689f6630c453a5b8cdacbd.zip
cpython-4d7701729caae30312689f6630c453a5b8cdacbd.tar.gz
cpython-4d7701729caae30312689f6630c453a5b8cdacbd.tar.bz2
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.py12
1 files changed, 4 insertions, 8 deletions
diff --git a/Lib/trace.py b/Lib/trace.py
index 7fffe86..969b396 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