| #include "parts.h" | |
| #include "../_testcapi/util.h" // NULLABLE, RETURN_INT | |
| #include "pycore_critical_section.h" | |
| #include "pycore_setobject.h" | |
| static PyObject * | |
| set_update(PyObject *self, PyObject *args) | |
| { | |
| PyObject *set, *iterable; | |
| if (!PyArg_ParseTuple(args, "OO", &set, &iterable)) { | |
| return NULL; | |
| } | |
| NULLABLE(set); | |
| NULLABLE(iterable); | |
| RETURN_INT(_PySet_Update(set, iterable)); | |
| } | |
| static PyObject * | |
| set_next_entry(PyObject *self, PyObject *args) | |
| { | |
| int rc; | |
| Py_ssize_t pos; | |
| Py_hash_t hash = (Py_hash_t)UNINITIALIZED_SIZE; | |
| PyObject *set, *item = UNINITIALIZED_PTR; | |
| if (!PyArg_ParseTuple(args, "On", &set, &pos)) { | |
| return NULL; | |
| } | |
| NULLABLE(set); | |
| Py_BEGIN_CRITICAL_SECTION(set); | |
| rc = _PySet_NextEntryRef(set, &pos, &item, &hash); | |
| Py_END_CRITICAL_SECTION(); | |
| if (rc == 1) { | |
| PyObject *ret = Py_BuildValue("innO", rc, pos, hash, item); | |
| Py_DECREF(item); | |
| return ret; | |
| } | |
| assert(item == UNINITIALIZED_PTR); | |
| assert(hash == (Py_hash_t)UNINITIALIZED_SIZE); | |
| if (rc == -1) { | |
| return NULL; | |
| } | |
| assert(rc == 0); | |
| Py_RETURN_NONE; | |
| } | |
| static PyMethodDef TestMethods[] = { | |
| {"set_update", set_update, METH_VARARGS}, | |
| {"set_next_entry", set_next_entry, METH_VARARGS}, | |
| {NULL}, | |
| }; | |
| int | |
| _PyTestInternalCapi_Init_Set(PyObject *m) | |
| { | |
| if (PyModule_AddFunctions(m, TestMethods) < 0) { | |
| return -1; | |
| } | |
| return 0; | |
| } |