(original) (raw)

changeset: 103470:861ddad3e0c1 parent: 103467:a25c39873d93 user: Serhiy Storchaka storchaka@gmail.com date: Sat Sep 10 00:53:02 2016 +0300 files: Misc/NEWS Objects/typeobject.c description: Issue #25856: The __module__ attribute of extension classes and functions now is interned. This leads to more compact pickle data with protocol 4. diff -r a25c39873d93 -r 861ddad3e0c1 Misc/NEWS --- a/Misc/NEWS Fri Sep 09 14:07:44 2016 -0700 +++ b/Misc/NEWS Sat Sep 10 00:53:02 2016 +0300 @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #25856: The __module__ attribute of extension classes and functions + now is interned. This leads to more compact pickle data with protocol 4. + - Issue #27213: Rework CALL_FUNCTION* opcodes to produce shorter and more efficient bytecode. Patch by Demur Rumed, design by Serhiy Storchaka, reviewed by Serhiy Storchaka and Victor Stinner. diff -r a25c39873d93 -r 861ddad3e0c1 Objects/typeobject.c --- a/Objects/typeobject.c Fri Sep 09 14:07:44 2016 -0700 +++ b/Objects/typeobject.c Sat Sep 10 00:53:02 2016 +0300 @@ -454,27 +454,30 @@ static PyObject * type_module(PyTypeObject *type, void *context) { - char *s; + PyObject *mod; if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { - PyObject *mod = _PyDict_GetItemId(type->tp_dict, &PyId___module__); - if (!mod) { + mod = _PyDict_GetItemId(type->tp_dict, &PyId___module__); + if (mod == NULL) { PyErr_Format(PyExc_AttributeError, "__module__"); - return 0; + return NULL; } Py_INCREF(mod); - return mod; } else { - PyObject *name; - s = strrchr(type->tp_name, '.'); - if (s != NULL) - return PyUnicode_FromStringAndSize( + const char *s = strrchr(type->tp_name, '.'); + if (s != NULL) { + mod = PyUnicode_FromStringAndSize( type->tp_name, (Py_ssize_t)(s - type->tp_name)); - name = _PyUnicode_FromId(&PyId_builtins); - Py_XINCREF(name); - return name; - } + if (mod != NULL) + PyUnicode_InternInPlace(&mod); + } + else { + mod = _PyUnicode_FromId(&PyId_builtins); + Py_XINCREF(mod); + } + } + return mod; } static int /storchaka@gmail.com