Issue #20637: Key-sharing now also works for instance dictionaries of subclasses. Patch by Peter Ingebretson.
This commit is contained in:
parent
32f30a8d9b
commit
f0b5a7c0f6
|
@ -1,6 +1,6 @@
|
|||
# Python test set -- part 6, built-in types
|
||||
|
||||
from test.support import run_unittest, run_with_locale
|
||||
from test.support import run_unittest, run_with_locale, cpython_only
|
||||
import collections
|
||||
import pickle
|
||||
import locale
|
||||
|
@ -1170,9 +1170,31 @@ class SimpleNamespaceTests(unittest.TestCase):
|
|||
self.assertEqual(ns, ns_roundtrip, pname)
|
||||
|
||||
|
||||
class SharedKeyTests(unittest.TestCase):
|
||||
|
||||
@cpython_only
|
||||
def test_subclasses(self):
|
||||
# Verify that subclasses can share keys (per PEP 412)
|
||||
class A:
|
||||
pass
|
||||
class B(A):
|
||||
pass
|
||||
|
||||
a, b = A(), B()
|
||||
self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b)))
|
||||
self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({}))
|
||||
a.x, a.y, a.z, a.w = range(4)
|
||||
self.assertNotEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(b)))
|
||||
a2 = A()
|
||||
self.assertEqual(sys.getsizeof(vars(a)), sys.getsizeof(vars(a2)))
|
||||
self.assertLess(sys.getsizeof(vars(a)), sys.getsizeof({}))
|
||||
b.u, b.v, b.w, b.t = range(4)
|
||||
self.assertLess(sys.getsizeof(vars(b)), sys.getsizeof({}))
|
||||
|
||||
|
||||
def test_main():
|
||||
run_unittest(TypesTests, MappingProxyTests, ClassCreationTests,
|
||||
SimpleNamespaceTests)
|
||||
SimpleNamespaceTests, SharedKeyTests)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_main()
|
||||
|
|
|
@ -585,6 +585,7 @@ Aaron Iles
|
|||
Lars Immisch
|
||||
Bobby Impollonia
|
||||
Meador Inge
|
||||
Peter Ingebretson
|
||||
Tony Ingraldi
|
||||
John Interrante
|
||||
Bob Ippolito
|
||||
|
|
|
@ -5,6 +5,12 @@ Python News
|
|||
What's New in Python 3.4.1?
|
||||
===========================
|
||||
|
||||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #20637: Key-sharing now also works for instance dictionaries of
|
||||
subclasses. Patch by Peter Ingebretson.
|
||||
|
||||
Library
|
||||
-------
|
||||
|
||||
|
|
|
@ -2472,6 +2472,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
|
|||
type->tp_dictoffset = slotoffset;
|
||||
slotoffset += sizeof(PyObject *);
|
||||
}
|
||||
else if (!type->tp_dictoffset) {
|
||||
type->tp_dictoffset = base->tp_dictoffset;
|
||||
}
|
||||
if (type->tp_dictoffset) {
|
||||
et->ht_cached_keys = _PyDict_NewKeysForClass();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue