From a720559878f25f3f8ed46a81260844231bfc9d4b Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 27 May 2009 03:08:59 +0000 Subject: Merged revisions 72957 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72957 | benjamin.peterson | 2009-05-26 21:43:46 -0500 (Tue, 26 May 2009) | 1 line correctly handle descrs with __missing__ ........ --- Lib/test/test_descr.py | 11 ++++++++++- Objects/dictobject.c | 11 ++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index adcb55f..5c50571 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1562,6 +1562,13 @@ order (MRO) for bases """ return isinstance(int, obj) def do_issubclass(obj): return issubclass(int, obj) + def do_dict_missing(checker): + class DictSub(checker.__class__, dict): + pass + self.assertEqual(DictSub()["hi"], 4) + def some_number(self_, key): + self.assertEqual(key, "hi") + return 4 # It would be nice to have every special method tested here, but I'm # only listing the ones I can remember outside of typeobject.c, since it @@ -1573,6 +1580,8 @@ order (MRO) for bases """ {"__iter__" : iden, "__next__" : stop}), ("__sizeof__", sys.getsizeof, zero, set(), {}), ("__instancecheck__", do_isinstance, return_true, set(), {}), + ("__missing__", do_dict_missing, some_number, + set(("__class__",)), {}), ("__subclasscheck__", do_issubclass, return_true, set(("__bases__",)), {}), # These two fail because the compiler generates LOAD_ATTR to look @@ -1588,7 +1597,7 @@ order (MRO) for bases """ def __getattribute__(self, attr, test=self): if attr not in ok: test.fail("__getattribute__ called with {0}".format(attr)) - return object.__getattribute__(attr) + return object.__getattribute__(self, attr) class SpecialDescr(object): def __init__(self, impl): self.impl = impl diff --git a/Objects/dictobject.c b/Objects/dictobject.c index b39c614..97fa60b 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1128,13 +1128,14 @@ dict_subscript(PyDictObject *mp, register PyObject *key) /* Look up __missing__ method if we're a subclass. */ PyObject *missing; static PyObject *missing_str = NULL; - if (missing_str == NULL) - missing_str = - PyUnicode_InternFromString("__missing__"); - missing = _PyType_Lookup(Py_TYPE(mp), missing_str); + missing = _PyObject_LookupSpecial((PyObject *)mp, + "__missing__", + &missing_str); if (missing != NULL) return PyObject_CallFunctionObjArgs(missing, - (PyObject *)mp, key, NULL); + key, NULL); + else if (PyErr_Occurred()) + return NULL; } set_key_error(key); return NULL; -- cgit v0.12