From db780d0d13976b099b22bc5145a53ec3ff6c63ba Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 23 Apr 2012 13:44:32 -0400 Subject: fix instance dicts with str subclasses (#13903) --- Lib/test/test_dict.py | 10 ++++++++++ Objects/dictobject.c | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index cd396c8..cdd8b6c 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -879,6 +879,16 @@ class DictTest(unittest.TestCase): values = list(it) + [drop] self.assertEqual(sorted(values), sorted(list(data.values()))) + def test_instance_dict_getattr_str_subclass(self): + class Foo: + def __init__(self, msg): + self.msg = msg + f = Foo('123') + class _str(str): + pass + self.assertEqual(f.msg, getattr(f, _str('msg'))) + self.assertEqual(f.msg, f.__dict__[_str('msg')]) + from test import mapping_tests class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 2afbbae..51a8796 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -641,7 +641,11 @@ lookdict_split(PyDictObject *mp, PyObject *key, register PyDictKeyEntry *ep; if (!PyUnicode_CheckExact(key)) { - return lookdict(mp, key, hash, value_addr); + ep = lookdict(mp, key, hash, value_addr); + /* lookdict expects a combined-table, so fix value_addr */ + i = ep - ep0; + *value_addr = &mp->ma_values[i]; + return ep; } i = (size_t)hash & mask; ep = &ep0[i]; -- cgit v0.12