fix instance dicts with str subclasses (#13903)

This commit is contained in:
Benjamin Peterson 2012-04-23 13:44:32 -04:00
parent 53b977127f
commit db780d0d13
2 changed files with 15 additions and 1 deletions

View 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):

View 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];