Skip to content

Commit 70c4387

Browse files
committed
Convert set_reduce & set_pop
1 parent 0c0934b commit 70c4387

File tree

2 files changed

+82
-22
lines changed

2 files changed

+82
-22
lines changed

Objects/clinic/setobject.c.h

Lines changed: 50 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Objects/setobject.c

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -718,41 +718,48 @@ set_merge_dict(PySetObject *so, PyObject *other)
718718
return rv;
719719
}
720720

721+
/*[clinic input]
722+
@critical_section
723+
set.pop
724+
725+
Remove and return an arbitrary set element.
726+
727+
Raises KeyError if the set is empty.
728+
[clinic start generated code]*/
729+
721730
static PyObject *
722-
set_pop(PySetObject *so, PyObject *Py_UNUSED(ignored))
731+
set_pop_impl(PySetObject *self)
732+
/*[clinic end generated code: output=bf7ef01d2a364703 input=ac7a961b15e913b9]*/
723733
{
724734
setentry *entry;
725735
setentry *limit;
726736
PyObject *key = NULL;
727737

728738
Py_BEGIN_CRITICAL_SECTION(so);
729739
/* Make sure the search finger is in bounds */
730-
entry = so->table + (so->finger & so->mask);
731-
limit = so->table + so->mask;
740+
entry = self->table + (self->finger & self->mask);
741+
limit = self->table + self->mask;
732742

733-
if (so->used == 0) {
743+
if (self->used == 0) {
734744
PyErr_SetString(PyExc_KeyError, "pop from an empty set");
735745
goto exit;
736746
}
737747
while (entry->key == NULL || entry->key==dummy) {
738748
entry++;
739749
if (entry > limit)
740-
entry = so->table;
750+
entry = self->table;
741751
}
742752
key = entry->key;
743753
entry->key = dummy;
744754
entry->hash = -1;
745-
so->used--;
746-
so->finger = entry - so->table + 1; /* next place to start */
755+
self->used--;
756+
self->finger = entry - self->table + 1; /* next place to start */
747757

748758
exit:
749759
Py_END_CRITICAL_SECTION();
750760
return key;
751761
}
752762

753-
PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
754-
Raises KeyError if the set is empty.");
755-
756763
static int
757764
set_traverse(PySetObject *so, visitproc visit, void *arg)
758765
{
@@ -2223,22 +2230,29 @@ set_discard_impl(PySetObject *self, PyObject *key)
22232230
Py_RETURN_NONE;
22242231
}
22252232

2233+
/*[clinic input]
2234+
@critical_section
2235+
set.__reduce__
2236+
2237+
[clinic start generated code]*/
2238+
22262239
static PyObject *
2227-
set_reduce(PySetObject *so, PyObject *Py_UNUSED(ignored))
2240+
set___reduce___impl(PySetObject *self)
2241+
/*[clinic end generated code: output=aa78615d54922c94 input=27fbb72e6ebfc2b8]*/
22282242
{
22292243
PyObject *keys=NULL, *args=NULL, *result=NULL, *state=NULL;
22302244

2231-
Py_BEGIN_CRITICAL_SECTION(so);
2232-
keys = PySequence_List((PyObject *)so);
2245+
Py_BEGIN_CRITICAL_SECTION(self);
2246+
keys = PySequence_List((PyObject *)self);
22332247
if (keys == NULL)
22342248
goto done;
22352249
args = PyTuple_Pack(1, keys);
22362250
if (args == NULL)
22372251
goto done;
2238-
state = _PyObject_GetState((PyObject *)so);
2252+
state = _PyObject_GetState((PyObject *)self);
22392253
if (state == NULL)
22402254
goto done;
2241-
result = PyTuple_Pack(3, Py_TYPE(so), args, state);
2255+
result = PyTuple_Pack(3, Py_TYPE(self), args, state);
22422256
done:
22432257
Py_END_CRITICAL_SECTION();
22442258
Py_XDECREF(args);
@@ -2334,10 +2348,8 @@ static PyMethodDef set_methods[] = {
23342348
issubset_doc},
23352349
{"issuperset", (PyCFunction)set_issuperset, METH_O,
23362350
issuperset_doc},
2337-
{"pop", (PyCFunction)set_pop, METH_NOARGS,
2338-
pop_doc},
2339-
{"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2340-
reduce_doc},
2351+
SET_POP_METHODDEF
2352+
SET___REDUCE___METHODDEF
23412353
SET_REMOVE_METHODDEF
23422354
{"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
23432355
sizeof_doc},
@@ -2453,8 +2465,7 @@ static PyMethodDef frozenset_methods[] = {
24532465
issubset_doc},
24542466
{"issuperset", (PyCFunction)set_issuperset, METH_O,
24552467
issuperset_doc},
2456-
{"__reduce__", (PyCFunction)set_reduce, METH_NOARGS,
2457-
reduce_doc},
2468+
SET___REDUCE___METHODDEF
24582469
{"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS,
24592470
sizeof_doc},
24602471
{"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,

0 commit comments

Comments
 (0)