summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_descr.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-05-13 18:29:46 (GMT)
committerGuido van Rossum <guido@python.org>2002-05-13 18:29:46 (GMT)
commit4402241450fe679a3cc90e4491aaabee232bb4e2 (patch)
treef696f015b6c33b8cdce1c578c605ca32456f1119 /Lib/test/test_descr.py
parentdf4dabd5d2a983083ebedec7174aa22cee72b154 (diff)
downloadcpython-4402241450fe679a3cc90e4491aaabee232bb4e2.zip
cpython-4402241450fe679a3cc90e4491aaabee232bb4e2.tar.gz
cpython-4402241450fe679a3cc90e4491aaabee232bb4e2.tar.bz2
Jim Fulton reported a segfault in dir(). A heavily proxied object
returned a proxy for __class__ whose __bases__ was also a proxy. The merge_class_dict() helper for dir() assumed incorrectly that __bases__ would always be a tuple and used the in-line tuple API on the proxy. I will backport this to 2.2 as well.
Diffstat (limited to 'Lib/test/test_descr.py')
-rw-r--r--Lib/test/test_descr.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 353d0f2..e7e4a8f 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -365,6 +365,26 @@ def test_dir():
# object.
vereq(dir(None), dir(Ellipsis))
+ # Nasty test case for proxied objects
+ class Wrapper(object):
+ def __init__(self, obj):
+ self.__obj = obj
+ def __repr__(self):
+ return "Wrapper(%s)" % repr(self.__obj)
+ def __getitem__(self, key):
+ return Wrapper(self.__obj[key])
+ def __len__(self):
+ return len(self.__obj)
+ def __getattr__(self, name):
+ return Wrapper(getattr(self.__obj, name))
+
+ class C(object):
+ def __getclass(self):
+ return Wrapper(type(self))
+ __class__ = property(__getclass)
+
+ dir(C()) # This used to segfault
+
binops = {
'add': '+',
'sub': '-',