changeset: 91883:c55300337932 user: Martin v. Löwis date: Sat Jul 26 16:44:07 2014 +0200 files: Misc/NEWS Objects/typeobject.c description: Issue #22082: Clear interned strings in slotdefs. diff -r c5d8fae2b125 -r c55300337932 Misc/NEWS --- a/Misc/NEWS Sat Jul 26 15:25:04 2014 +0200 +++ b/Misc/NEWS Sat Jul 26 16:44:07 2014 +0200 @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #22082: Clear interned strings in slotdefs. + - Upgrade Unicode database to Unicode 7.0.0. - Issue #21897: Fix a crash with the f_locals attribute with closure diff -r c5d8fae2b125 -r c55300337932 Objects/typeobject.c --- a/Objects/typeobject.c Sat Jul 26 15:25:04 2014 +0200 +++ b/Objects/typeobject.c Sat Jul 26 16:44:07 2014 +0200 @@ -54,6 +54,9 @@ static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); +static void +clear_slotdefs(); + /* * finds the beginning of the docstring's introspection signature. * if present, returns a pointer pointing to the first '('. @@ -177,6 +180,7 @@ _PyType_Fini(void) { PyType_ClearCache(); + clear_slotdefs(); } void @@ -6508,15 +6512,15 @@ return 0; } +static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ static void init_slotdefs(void) { slotdef *p; - static int initialized = 0; - - if (initialized) + + if (slotdefs_initialized) return; for (p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ @@ -6525,7 +6529,17 @@ if (!p->name_strobj) Py_FatalError("Out of memory interning slotdef names"); } - initialized = 1; + slotdefs_initialized = 1; +} + +/* Undo init_slotdefs, releasing the interned strings. */ +static void clear_slotdefs() +{ + slotdef *p; + for (p = slotdefs; p->name; p++) { + Py_CLEAR(p->name_strobj); + } + slotdefs_initialized = 0; } /* Update the slots after assignment to a class (type) attribute. */