Merged revisions 84780-84781 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k
with some manual fixes
........
  r84780 | alexander.belopolsky | 2010-09-13 14:14:34 -0400 (Mon, 13 Sep 2010) | 3 lines

  Issue #9315: Fix for the trace module to record correct class name
  when tracing methods.  Unit tests. Patch by Eli Bendersky.
........
  r84781 | alexander.belopolsky | 2010-09-13 14:15:33 -0400 (Mon, 13 Sep 2010) | 1 line

  Removed debugging setting
........
This commit is contained in:
Alexander Belopolsky 2010-09-13 18:38:54 +00:00
parent 9ad66d2032
commit 9665637d44
5 changed files with 343 additions and 8 deletions

View file

@ -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