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
This commit is contained in:
parent
e9b9b35931
commit
60d6c7f0cc
|
@ -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):
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue