From f0b5a7c0f646d74265f1977154c829c8df79f76c Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sun, 23 Feb 2014 16:50:07 +0100 Subject: [PATCH] Issue #20637: Key-sharing now also works for instance dictionaries of subclasses. Patch by Peter Ingebretson. --- Lib/test/test_types.py | 26 ++++++++++++++++++++++++-- Misc/ACKS | 1 + Misc/NEWS | 6 ++++++ Objects/typeobject.c | 3 +++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index ec10752e6a..18e6b0a89c 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -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() diff --git a/Misc/ACKS b/Misc/ACKS index 12b5ab582f..14a8cb84ef 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -585,6 +585,7 @@ Aaron Iles Lars Immisch Bobby Impollonia Meador Inge +Peter Ingebretson Tony Ingraldi John Interrante Bob Ippolito diff --git a/Misc/NEWS b/Misc/NEWS index 306a8d6fbd..cfb05c2dbf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 ------- diff --git a/Objects/typeobject.c b/Objects/typeobject.c index f58960d28c..5a41387bc1 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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(); } -- 2.40.0