From: Amaury Forgeot d'Arc Date: Fri, 15 Feb 2008 21:22:45 +0000 (+0000) Subject: Issue #2115: __slot__ attributes setting was 10x slower. X-Git-Tag: v2.6a1~158 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60d6c7f0cc0749a8ccd29fce652971d1833cc319;p=python Issue #2115: __slot__ attributes setting was 10x slower. Also correct a possible crash using ABCs. This change is exactly the same as an optimisation done 5 years ago, but on slot *access*: http://svn.python.org/view?view=rev&rev=28297 --- diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 755a967f45..3c607f70cc 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1182,6 +1182,24 @@ order (MRO) for bases """ a.foo = 42 self.assertEqual(a.__dict__, {"foo": 42}) + def test_slots_descriptor(self): + # Issue2115: slot descriptors did not correctly check + # the type of the given object + import abc + class MyABC: + __metaclass__ = abc.ABCMeta + __slots__ = "a" + + class Unrelated(object): + pass + MyABC.register(Unrelated) + + u = Unrelated() + self.assert_(isinstance(u, MyABC)) + + # This used to crash + self.assertRaises(TypeError, MyABC.a.__set__, u, 3) + def test_dynamics(self): # Testing class attribute propagation... class D(object): diff --git a/Misc/NEWS b/Misc/NEWS index fdc81c1a53..74466d6914 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,10 @@ What's New in Python 2.6 alpha 1? Core and builtins ----------------- +- Issue #2115: Important speedup in setting __slot__ attributes. Also + prevent a possible crash: an Abstract Base Class would try to access a slot + on a registered virtual subclass. + - Fixed repr() and str() of complex numbers with infinity or nan as real or imaginary part. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 4b599ec2c8..9823b7436c 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -166,7 +166,7 @@ descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value, int *pres) { assert(obj != NULL); - if (!PyObject_IsInstance(obj, (PyObject *)(descr->d_type))) { + if (!PyObject_TypeCheck(obj, descr->d_type)) { PyErr_Format(PyExc_TypeError, "descriptor '%.200s' for '%.100s' objects " "doesn't apply to '%.100s' object",