]> granicus.if.org Git - python/commitdiff
fix instance dicts with str subclasses (#13903)
authorBenjamin Peterson <benjamin@python.org>
Mon, 23 Apr 2012 17:44:32 +0000 (13:44 -0400)
committerBenjamin Peterson <benjamin@python.org>
Mon, 23 Apr 2012 17:44:32 +0000 (13:44 -0400)
Lib/test/test_dict.py
Objects/dictobject.c

index cd396c8200f747c0ac3792e7d7a3c783317d1aba..cdd8b6c7a381fca0336845f91cd28d94b92821c6 100644 (file)
@@ -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):
index 2afbbaee503e280280fc52bf5f6a3a317b4060f1..51a8796ae381132187fcbaa72b152deb5784e160 100644 (file)
@@ -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];