From: Martin v. Löwis Date: Sat, 26 Jul 2014 14:44:07 +0000 (+0200) Subject: Issue #22082: Clear interned strings in slotdefs. X-Git-Tag: v3.5.0a1~1187 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=996b67144665b33a31135d946e3e039a864771df;p=python Issue #22082: Clear interned strings in slotdefs. --- diff --git a/Misc/NEWS b/Misc/NEWS index c510a1a582..9a75f28b83 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Release date: TBA 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 --git a/Objects/typeobject.c b/Objects/typeobject.c index 4f87817984..b97c32ecbf 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,6 +54,9 @@ _Py_IDENTIFIER(builtins); 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 @@ void _PyType_Fini(void) { PyType_ClearCache(); + clear_slotdefs(); } void @@ -6508,15 +6512,15 @@ update_slots_callback(PyTypeObject *type, void *data) 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 @@ init_slotdefs(void) 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. */