| #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; |
| } |