summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_dict.py10
-rw-r--r--Objects/dictobject.c6
2 files changed, 15 insertions, 1 deletions
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index cd396c8200..cdd8b6c7a3 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 2afbbaee50..51a8796ae3 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];