diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2345,6 +2345,45 @@ return set_update_internal((PySetObject *)set, iterable); } +PyObject * +_PySet_Intern(PyObject *set, PyObject *key) +{ + PySetObject *so; + setentry *entry; + Py_hash_t hash; + + if (!PySet_Check(set)) { + PyErr_BadInternalCall(); + return NULL; + } + so = (PySetObject *)set; + if (!PyUnicode_CheckExact(key) || + (hash = ((PyASCIIObject *) key)->hash) == -1) { + hash = PyObject_Hash(key); + if (hash == -1) + return NULL; + } + entry = so->lookup(so, key, hash); + if (entry == NULL) + return NULL; + if (entry->key == NULL) { + so->fill++; + } else if (entry->key != dummy) { + key = entry->key; + Py_INCREF(key); + return key; + } + Py_INCREF(key); + entry->key = key; + entry->hash = hash; + so->used++; + if (so->fill*3 < (so->mask+1)*2) + return key; + if (set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4)) + return NULL; + return key; +} + #ifdef Py_DEBUG /* Test code to be called with any three element set.