diff options
author | Guido van Rossum <guido@python.org> | 2002-05-13 18:29:46 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2002-05-13 18:29:46 (GMT) |
commit | 4402241450fe679a3cc90e4491aaabee232bb4e2 (patch) | |
tree | f696f015b6c33b8cdce1c578c605ca32456f1119 /Lib/test/test_descr.py | |
parent | df4dabd5d2a983083ebedec7174aa22cee72b154 (diff) | |
download | cpython-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.py | 20 |
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': '-', |