Issue #25856: The __module__ attribute of extension classes and functions

now is interned. This leads to more compact pickle data with protocol 4.
This commit is contained in:
Serhiy Storchaka 2016-09-10 00:53:02 +03:00
parent ae8b69c410
commit 7c19affdce
2 changed files with 18 additions and 12 deletions

View File

@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 1
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.

View File

@ -454,27 +454,30 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
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