mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
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:
parent
6fa98fb7ec
commit
a9f48a0d4f
4 changed files with 42 additions and 2 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue