cpython/Modules/_testinternalcapi/set.c

64 lines
1.4 KiB
C

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