diff -r 074e12441ed6 -r bfa360f841cf Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c Tue Mar 13 19:48:37 2012 -0700 +++ b/Modules/_hashopenssl.c Thu Mar 15 16:35:08 2012 +0800 @@ -516,7 +516,7 @@ if (py_name == NULL) { state->error = 1; } else { - if (PySet_Add(state->set, py_name) != 0) { + if (PySet_Add(state->set, py_name) == -1) { Py_DECREF(py_name); state->error = 1; } diff -r 074e12441ed6 -r bfa360f841cf Objects/setobject.c --- a/Objects/setobject.c Tue Mar 13 19:48:37 2012 -0700 +++ b/Objects/setobject.c Thu Mar 15 16:35:08 2012 +0800 @@ -226,17 +226,19 @@ entry->key = key; entry->hash = hash; so->used++; + return 1; } else if (entry->key == dummy) { /* DUMMY */ entry->key = key; entry->hash = hash; so->used++; Py_DECREF(dummy); + return 1; } else { /* ACTIVE */ Py_DECREF(key); + return 0; } - return 0; } /* @@ -361,29 +363,35 @@ /* CAUTION: set_add_key/entry() must guarantee it won't resize the table */ static int -set_add_entry(register PySetObject *so, setentry *entry) -{ +set_add_key_hash(register PySetObject *so, PyObject *key, Py_hash_t hash) +{ register Py_ssize_t n_used; - PyObject *key = entry->key; - Py_hash_t hash = entry->hash; assert(so->fill <= so->mask); /* at least one empty slot */ n_used = so->used; Py_INCREF(key); - if (set_insert_key(so, key, hash) == -1) { + int ret = set_insert_key(so, key, hash); + if (ret == -1) { Py_DECREF(key); return -1; } if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2)) - return 0; - return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); + return ret; + if (-1 == set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4)) + return -1; + return ret; +} + +static int +set_add_entry(register PySetObject *so, setentry *entry) +{ + return set_add_key_hash(so, entry->key, entry->hash); } static int set_add_key(register PySetObject *so, PyObject *key) { - register Py_hash_t hash; - register Py_ssize_t n_used; + Py_hash_t hash; if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *) key)->hash) == -1) { @@ -391,16 +399,7 @@ if (hash == -1) return -1; } - assert(so->fill <= so->mask); /* at least one empty slot */ - n_used = so->used; - Py_INCREF(key); - if (set_insert_key(so, key, hash) == -1) { - Py_DECREF(key); - return -1; - } - if (!(so->used > n_used && so->fill*3 >= (so->mask+1)*2)) - return 0; - return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); + return set_add_key_hash(so, key, hash); } #define DISCARD_NOTFOUND 0 @@ -408,7 +407,8 @@ static int set_discard_entry(PySetObject *so, setentry *oldentry) -{ register setentry *entry; +{ + register setentry *entry; PyObject *old_key; entry = (so->lookup)(so, oldentry->key, oldentry->hash); @@ -935,11 +935,7 @@ return -1; } while (_PyDict_Next(other, &pos, &key, &value, &hash)) { - setentry an_entry; - - an_entry.hash = hash; - an_entry.key = key; - if (set_add_entry(so, &an_entry) == -1) + if (set_add_key_hash(so, key, hash) == -1) return -1; } return 0; @@ -1557,11 +1553,8 @@ if (PyDict_CheckExact(other)) { while (set_next(so, &pos, &entry)) { - setentry entrycopy; - entrycopy.hash = entry->hash; - entrycopy.key = entry->key; if (!_PyDict_Contains(other, entry->key, entry->hash)) { - if (set_add_entry((PySetObject *)result, &entrycopy) == -1) { + if (set_add_key_hash((PySetObject *)result, entry->key, entry->hash) == -1) { Py_DECREF(result); return NULL; } @@ -1836,9 +1829,16 @@ static PyObject * set_add(PySetObject *so, PyObject *key) { - if (set_add_key(so, key) == -1) + switch (set_add_key(so, key)) { + case 1: + Py_RETURN_TRUE; + case 0: + Py_RETURN_FALSE; + default: + PyErr_BadInternalCall(); + case -1: return NULL; - Py_RETURN_NONE; + } } PyDoc_STRVAR(add_doc, @@ -2403,7 +2403,7 @@ elem = PySet_Pop(ob); assert(PySet_Contains(ob, elem) == 0); assert(PySet_GET_SIZE(ob) == 2); - assert(PySet_Add(ob, elem) == 0); + assert(PySet_Add(ob, elem) != -1); assert(PySet_Contains(ob, elem) == 1); assert(PySet_GET_SIZE(ob) == 3); assert(PySet_Discard(ob, elem) == 1); @@ -2421,7 +2421,7 @@ f = PyFrozenSet_New(dup); assertRaises(PySet_Clear(f) == -1, PyExc_SystemError); assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError); - assert(PySet_Add(f, elem) == 0); + assert(PySet_Add(f, elem) != -1); Py_INCREF(f); assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError); Py_DECREF(f); diff -r 074e12441ed6 -r bfa360f841cf Python/ceval.c --- a/Python/ceval.c Tue Mar 13 19:48:37 2012 -0700 +++ b/Python/ceval.c Thu Mar 15 16:35:08 2012 +0800 @@ -1612,7 +1612,7 @@ v = stack_pointer[-oparg]; err = PySet_Add(v, w); Py_DECREF(w); - if (err == 0) { + if (err >= 0) { PREDICT(JUMP_ABSOLUTE); DISPATCH(); } @@ -2230,7 +2230,7 @@ err = PySet_Add(x, w); Py_DECREF(w); } - if (err != 0) { + if (err < 0) { Py_DECREF(x); break; }