mirror of https://github.com/python/cpython
64 lines
1.4 KiB
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;
|
|
}
|