Skip to content

Commit

Permalink
gh-101277: Add combinations and cwr types to module state
Browse files Browse the repository at this point in the history
  • Loading branch information
erlend-aasland committed Jan 24, 2023
1 parent aca9ef5 commit 64be5ab
Showing 1 changed file with 57 additions and 93 deletions.
150 changes: 57 additions & 93 deletions Modules/itertoolsmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
*/

typedef struct {
PyTypeObject *combinations_type;
PyTypeObject *cwr_type;
PyTypeObject *cycle_type;
PyTypeObject *dropwhile_type;
PyTypeObject *groupby_type;
Expand Down Expand Up @@ -49,22 +51,20 @@ class itertools.dropwhile "dropwhileobject *" "clinic_state()->dropwhile_type"
class itertools.takewhile "takewhileobject *" "clinic_state()->takewhile_type"
class itertools.starmap "starmapobject *" "clinic_state()->starmap_type"
class itertools.chain "chainobject *" "&chain_type"
class itertools.combinations "combinationsobject *" "&combinations_type"
class itertools.combinations_with_replacement "cwr_object *" "&cwr_type"
class itertools.combinations "combinationsobject *" "clinic_state()->combinations_type"
class itertools.combinations_with_replacement "cwr_object *" "clinic_state()->cwr_type"
class itertools.permutations "permutationsobject *" "&permutations_type"
class itertools.accumulate "accumulateobject *" "&accumulate_type"
class itertools.compress "compressobject *" "&compress_type"
class itertools.filterfalse "filterfalseobject *" "&filterfalse_type"
class itertools.count "countobject *" "&count_type"
class itertools.pairwise "pairwiseobject *" "&pairwise_type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3b9f0718b7d49b01]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=d44fee9ebae461fb]*/

static PyTypeObject teedataobject_type;
static PyTypeObject tee_type;
static PyTypeObject batched_type;
static PyTypeObject combinations_type;
static PyTypeObject cwr_type;
static PyTypeObject permutations_type;
static PyTypeObject accumulate_type;
static PyTypeObject compress_type;
Expand Down Expand Up @@ -2705,12 +2705,14 @@ itertools_combinations_impl(PyTypeObject *type, PyObject *iterable,
static void
combinations_dealloc(combinationsobject *co)
{
PyTypeObject *tp = Py_TYPE(co);
PyObject_GC_UnTrack(co);
Py_XDECREF(co->pool);
Py_XDECREF(co->result);
if (co->indices != NULL)
PyMem_Free(co->indices);
Py_TYPE(co)->tp_free(co);
tp->tp_free(co);
Py_DECREF(tp);
}

static PyObject *
Expand All @@ -2724,6 +2726,7 @@ combinations_sizeof(combinationsobject *co, void *unused)
static int
combinations_traverse(combinationsobject *co, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(co));
Py_VISIT(co->pool);
Py_VISIT(co->result);
return 0;
Expand Down Expand Up @@ -2894,48 +2897,25 @@ static PyMethodDef combinations_methods[] = {
{NULL, NULL} /* sentinel */
};

static PyTypeObject combinations_type = {
PyVarObject_HEAD_INIT(NULL, 0)
"itertools.combinations", /* tp_name */
sizeof(combinationsobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)combinations_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_async */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */
itertools_combinations__doc__, /* tp_doc */
(traverseproc)combinations_traverse,/* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)combinations_next, /* tp_iternext */
combinations_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
itertools_combinations, /* tp_new */
PyObject_GC_Del, /* tp_free */
static PyType_Slot combinations_slots[] = {
{Py_tp_dealloc, combinations_dealloc},
{Py_tp_getattro, PyObject_GenericGetAttr},
{Py_tp_doc, (void *)itertools_combinations__doc__},
{Py_tp_traverse, combinations_traverse},
{Py_tp_iter, PyObject_SelfIter},
{Py_tp_iternext, combinations_next},
{Py_tp_methods, combinations_methods},
{Py_tp_new, itertools_combinations},
{Py_tp_free, PyObject_GC_Del},
{0, NULL},
};

static PyType_Spec combinations_spec = {
.name = "itertools.combinations",
.basicsize = sizeof(combinationsobject),
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_IMMUTABLETYPE),
.slots = combinations_slots,
};


Expand Down Expand Up @@ -3039,12 +3019,14 @@ itertools_combinations_with_replacement_impl(PyTypeObject *type,
static void
cwr_dealloc(cwrobject *co)
{
PyTypeObject *tp = Py_TYPE(co);
PyObject_GC_UnTrack(co);
Py_XDECREF(co->pool);
Py_XDECREF(co->result);
if (co->indices != NULL)
PyMem_Free(co->indices);
Py_TYPE(co)->tp_free(co);
tp->tp_free(co);
Py_DECREF(tp);
}

static PyObject *
Expand All @@ -3058,6 +3040,7 @@ cwr_sizeof(cwrobject *co, void *unused)
static int
cwr_traverse(cwrobject *co, visitproc visit, void *arg)
{
Py_VISIT(Py_TYPE(co));
Py_VISIT(co->pool);
Py_VISIT(co->result);
return 0;
Expand Down Expand Up @@ -3218,48 +3201,25 @@ static PyMethodDef cwr_methods[] = {
{NULL, NULL} /* sentinel */
};

static PyTypeObject cwr_type = {
PyVarObject_HEAD_INIT(NULL, 0)
"itertools.combinations_with_replacement", /* tp_name */
sizeof(cwrobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)cwr_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_as_async */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */
itertools_combinations_with_replacement__doc__, /* tp_doc */
(traverseproc)cwr_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)cwr_next, /* tp_iternext */
cwr_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
itertools_combinations_with_replacement, /* tp_new */
PyObject_GC_Del, /* tp_free */
static PyType_Slot cwr_slots[] = {
{Py_tp_dealloc, cwr_dealloc},
{Py_tp_getattro, PyObject_GenericGetAttr},
{Py_tp_doc, (void *)itertools_combinations_with_replacement__doc__},
{Py_tp_traverse, cwr_traverse},
{Py_tp_iter, PyObject_SelfIter},
{Py_tp_iternext, cwr_next},
{Py_tp_methods, cwr_methods},
{Py_tp_new, itertools_combinations_with_replacement},
{Py_tp_free, PyObject_GC_Del},
{0, NULL},
};

static PyType_Spec cwr_spec = {
.name = "itertools.combinations_with_replacement",
.basicsize = sizeof(cwrobject),
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_IMMUTABLETYPE),
.slots = cwr_slots,
};


Expand Down Expand Up @@ -4881,6 +4841,8 @@ static int
itertoolsmodule_traverse(PyObject *mod, visitproc visit, void *arg)
{
itertools_state *state = get_module_state(mod);
Py_VISIT(state->combinations_type);
Py_VISIT(state->cwr_type);
Py_VISIT(state->cycle_type);
Py_VISIT(state->dropwhile_type);
Py_VISIT(state->groupby_type);
Expand All @@ -4894,6 +4856,8 @@ static int
itertoolsmodule_clear(PyObject *mod)
{
itertools_state *state = get_module_state(mod);
Py_CLEAR(state->combinations_type);
Py_CLEAR(state->cwr_type);
Py_CLEAR(state->cycle_type);
Py_CLEAR(state->dropwhile_type);
Py_CLEAR(state->groupby_type);
Expand Down Expand Up @@ -4924,6 +4888,8 @@ static int
itertoolsmodule_exec(PyObject *mod)
{
itertools_state *state = get_module_state(mod);
ADD_TYPE(mod, state->combinations_type, &combinations_spec);
ADD_TYPE(mod, state->cwr_type, &cwr_spec);
ADD_TYPE(mod, state->cycle_type, &cycle_spec);
ADD_TYPE(mod, state->dropwhile_type, &dropwhile_spec);
ADD_TYPE(mod, state->groupby_type, &groupby_spec);
Expand All @@ -4934,8 +4900,6 @@ itertoolsmodule_exec(PyObject *mod)
PyTypeObject *typelist[] = {
&accumulate_type,
&batched_type,
&combinations_type,
&cwr_type,
&islice_type,
&chain_type,
&compress_type,
Expand Down

0 comments on commit 64be5ab

Please sign in to comment.