Fix getting line number with nasty __getattr__.
When an object has a custom __getattr__ which always returns a non-int, we tried to get compat_co_firstlineno from it and checked it was a integer, which caused an exception if such a class is mistakenly collected. If we still mistakenly collect such a class (which is likely to be something other than a test), we now skip it with a warning (because it probably has an __init__) instead of producing an error. See #1204.
This commit is contained in:
@@ -384,12 +384,13 @@ class PyobjMixin(PyobjContext):
|
||||
def reportinfo(self):
|
||||
# XXX caching?
|
||||
obj = self.obj
|
||||
if hasattr(obj, 'compat_co_firstlineno'):
|
||||
compat_co_firstlineno = getattr(obj, 'compat_co_firstlineno', None)
|
||||
if isinstance(compat_co_firstlineno, int):
|
||||
# nose compatibility
|
||||
fspath = sys.modules[obj.__module__].__file__
|
||||
if fspath.endswith(".pyc"):
|
||||
fspath = fspath[:-1]
|
||||
lineno = obj.compat_co_firstlineno
|
||||
lineno = compat_co_firstlineno
|
||||
else:
|
||||
fspath, lineno = getfslineno(obj)
|
||||
modpath = self.getmodpath()
|
||||
|
||||
Reference in New Issue
Block a user