diff -r 46f8188f8646 Objects/dictobject.c --- a/Objects/dictobject.c Fri Jan 27 13:05:09 2017 +0000 +++ b/Objects/dictobject.c Sat Jan 28 11:45:21 2017 +0900 @@ -3331,19 +3331,17 @@ return PyDict_SetItem(v, kv, item); } int PyDict_SetItemString(PyObject *v, const char *key, PyObject *item) { - PyObject *kv; - int err; - kv = PyUnicode_FromString(key); - if (kv == NULL) + PyObject *kv = PyUnicode_InternFromString(key); + if (kv == NULL) { return -1; - PyUnicode_InternInPlace(&kv); /* XXX Should we really? */ - err = PyDict_SetItem(v, kv, item); + } + int err = PyDict_SetItem(v, kv, item); Py_DECREF(kv); return err; } int _PyDict_DelItemId(PyObject *v, _Py_Identifier *key) diff -r 46f8188f8646 Objects/typeobject.c --- a/Objects/typeobject.c Fri Jan 27 13:05:09 2017 +0000 +++ b/Objects/typeobject.c Sat Jan 28 11:45:21 2017 +0900 @@ -4535,83 +4535,117 @@ add_methods(PyTypeObject *type, PyMethodDef *meth) { PyObject *dict = type->tp_dict; for (; meth->ml_name != NULL; meth++) { PyObject *descr; - int err; - if (PyDict_GetItemString(dict, meth->ml_name) && - !(meth->ml_flags & METH_COEXIST)) - continue; + PyObject *name = PyUnicode_FromString(meth->ml_name); + if (name == NULL) { + return -1; + } + + if (PyDict_GetItem(dict, name) && !(meth->ml_flags & METH_COEXIST)) { + Py_DECREF(name); + continue; + } + PyUnicode_InternInPlace(&name); + if (meth->ml_flags & METH_CLASS) { if (meth->ml_flags & METH_STATIC) { PyErr_SetString(PyExc_ValueError, "method cannot be both class and static"); + Py_DECREF(name); return -1; } descr = PyDescr_NewClassMethod(type, meth); } else if (meth->ml_flags & METH_STATIC) { PyObject *cfunc = PyCFunction_NewEx(meth, (PyObject*)type, NULL); - if (cfunc == NULL) + if (cfunc == NULL) { + Py_DECREF(name); return -1; + } descr = PyStaticMethod_New(cfunc); Py_DECREF(cfunc); } else { descr = PyDescr_NewMethod(type, meth); } - if (descr == NULL) + if (descr == NULL) { + Py_DECREF(name); return -1; - err = PyDict_SetItemString(dict, meth->ml_name, descr); + } + int err = PyDict_SetItem(dict, name, descr); + Py_DECREF(name); Py_DECREF(descr); - if (err < 0) + if (err < 0) { return -1; + } } return 0; } static int add_members(PyTypeObject *type, PyMemberDef *memb) { PyObject *dict = type->tp_dict; for (; memb->name != NULL; memb++) { - PyObject *descr; - if (PyDict_GetItemString(dict, memb->name)) + PyObject *name = PyUnicode_FromString(memb->name); + if (name == NULL) { + return -1; + } + + if (PyDict_GetItem(dict, name)) { + Py_DECREF(name); continue; - descr = PyDescr_NewMember(type, memb); - if (descr == NULL) + } + PyUnicode_InternInPlace(&name); + + PyObject *descr = PyDescr_NewMember(type, memb); + if (descr == NULL) { + Py_DECREF(name); return -1; - if (PyDict_SetItemString(dict, memb->name, descr) < 0) { - Py_DECREF(descr); + } + + int err = PyDict_SetItem(dict, name, descr); + Py_DECREF(name); + Py_DECREF(descr); + if (err) { return -1; } - Py_DECREF(descr); } return 0; } static int add_getset(PyTypeObject *type, PyGetSetDef *gsp) { PyObject *dict = type->tp_dict; for (; gsp->name != NULL; gsp++) { - PyObject *descr; - if (PyDict_GetItemString(dict, gsp->name)) + PyObject *name = PyUnicode_FromString(gsp->name); + if (name == NULL) { + return -1; + } + if (PyDict_GetItem(dict, name)) { + Py_DECREF(name); continue; - descr = PyDescr_NewGetSet(type, gsp); - - if (descr == NULL) + } + PyUnicode_InternInPlace(&name); + + PyObject *descr = PyDescr_NewGetSet(type, gsp); + if (descr == NULL) { return -1; - if (PyDict_SetItemString(dict, gsp->name, descr) < 0) { - Py_DECREF(descr); + } + int err = PyDict_SetItem(dict, name, descr); + Py_DECREF(name); + Py_DECREF(descr); + if (err) { return -1; } - Py_DECREF(descr); } return 0; } static void inherit_special(PyTypeObject *type, PyTypeObject *base)