[Python-checkins] cpython: Issue #20637: Key-sharing now also works for instance dictionaries of
antoine.pitrou
python-checkins at python.org
Sun Feb 23 16:51:17 CET 2014
http://hg.python.org/cpython/rev/16229573e73e
changeset: 89335:16229573e73e
user: Antoine Pitrou <solipsis at pitrou.net>
date: Sun Feb 23 16:50:07 2014 +0100
summary:
Issue #20637: Key-sharing now also works for instance dictionaries of subclasses. Patch by Peter Ingebretson.
files:
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
--- 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 @@
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
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -585,6 +585,7 @@
Lars Immisch
Bobby Impollonia
Meador Inge
+Peter Ingebretson
Tony Ingraldi
John Interrante
Bob Ippolito
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -5,6 +5,12 @@
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
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -2472,6 +2472,9 @@
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();
}
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list