Merged revisions 72223 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72223 | antoine.pitrou | 2009-05-02 23:13:23 +0200 (sam., 02 mai 2009) | 5 lines

  Isue #5084: unpickling now interns the attribute names of pickled objects,
  saving memory and avoiding growth in size of subsequent pickles. Proposal
  and original patch by Jake McGuire.
........
This commit is contained in:
Antoine Pitrou 2009-05-02 21:41:14 +00:00
parent 6fa98fb7ec
commit a9f48a0d4f
4 changed files with 42 additions and 2 deletions

View file

@ -4020,6 +4020,8 @@ load_build(UnpicklerObject *self)
/* Set inst.__dict__ from the state dict (if any). */
if (state != Py_None) {
PyObject *dict;
PyObject *d_key, *d_value;
Py_ssize_t i;
if (!PyDict_Check(state)) {
PyErr_SetString(UnpicklingError, "state is not a dictionary");
@ -4029,7 +4031,19 @@ load_build(UnpicklerObject *self)
if (dict == NULL)
goto error;
PyDict_Update(dict, state);
i = 0;
while (PyDict_Next(state, &i, &d_key, &d_value)) {
/* normally the keys for instance attributes are
interned. we should try to do that here. */
Py_INCREF(d_key);
if (PyUnicode_CheckExact(d_key))
PyUnicode_InternInPlace(&d_key);
if (PyObject_SetItem(dict, d_key, d_value) < 0) {
Py_DECREF(d_key);
goto error;
}
Py_DECREF(d_key);
}
Py_DECREF(dict);
}