diff options
| author | Inada Naoki <songofacandy@gmail.com> | 2019-12-03 21:18:17 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-12-03 21:18:17 +0900 |
| commit | 2c6668941f72e3bcb797d096437683eca4e3caf5 (patch) | |
| tree | e10aed39d7ae7bd560992d142a94ccb0a1cf074c | |
| parent | e419cd8e2db6b8226bd681b52b6acfe70d8e6a86 (diff) | |
| download | msgpack-python-2c6668941f72e3bcb797d096437683eca4e3caf5.tar.gz | |
Intern map keys (#381)
Fixes #372.
| -rw-r--r-- | msgpack/fallback.py | 2 | ||||
| -rw-r--r-- | msgpack/unpack.h | 3 |
2 files changed, 5 insertions, 0 deletions
diff --git a/msgpack/fallback.py b/msgpack/fallback.py index 9e31213..9a48b71 100644 --- a/msgpack/fallback.py +++ b/msgpack/fallback.py @@ -644,6 +644,8 @@ class Unpacker(object): key = self._unpack(EX_CONSTRUCT) if self._strict_map_key and type(key) not in (unicode, bytes): raise ValueError("%s is not allowed for map key" % str(type(key))) + if not PY2 and type(key) is str: + key = sys.intern(key) ret[key] = self._unpack(EX_CONSTRUCT) if self._object_hook is not None: ret = self._object_hook(ret) diff --git a/msgpack/unpack.h b/msgpack/unpack.h index 539a991..ead5095 100644 --- a/msgpack/unpack.h +++ b/msgpack/unpack.h @@ -192,6 +192,9 @@ static inline int unpack_callback_map_item(unpack_user* u, unsigned int current, PyErr_Format(PyExc_ValueError, "%.100s is not allowed for map key", Py_TYPE(k)->tp_name); return -1; } + if (PyUnicode_CheckExact(k)) { + PyUnicode_InternInPlace(&k); + } if (u->has_pairs_hook) { msgpack_unpack_object item = PyTuple_Pack(2, k, v); if (!item) |
