summaryrefslogtreecommitdiffstats
path: root/Modules/_collectionsmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_collectionsmodule.c')
-rw-r--r--Modules/_collectionsmodule.c273
1 files changed, 152 insertions, 121 deletions
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 242abf2..54c1343 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -541,7 +541,7 @@ deque_count(dequeobject *deque, PyObject *v)
leftindex = 0;
}
}
- return PyInt_FromSsize_t(count);
+ return PyLong_FromSsize_t(count);
}
PyDoc_STRVAR(count_doc,
@@ -797,14 +797,14 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
static PyObject *
deque_repr(PyObject *deque)
{
- PyObject *aslist, *result, *fmt;
+ PyObject *aslist, *result;
int i;
i = Py_ReprEnter(deque);
if (i != 0) {
if (i < 0)
return NULL;
- return PyString_FromString("[...]");
+ return PyUnicode_FromString("[...]");
}
aslist = PySequence_List(deque);
@@ -813,74 +813,16 @@ deque_repr(PyObject *deque)
return NULL;
}
if (((dequeobject *)deque)->maxlen != -1)
- fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",
- ((dequeobject *)deque)->maxlen);
+
+ result = PyUnicode_FromFormat("deque(%R, maxlen=%zd)",
+ aslist, ((dequeobject *)deque)->maxlen);
else
- fmt = PyString_FromString("deque(%r)");
- if (fmt == NULL) {
- Py_DECREF(aslist);
- Py_ReprLeave(deque);
- return NULL;
- }
- result = PyString_Format(fmt, aslist);
- Py_DECREF(fmt);
+ result = PyUnicode_FromFormat("deque(%R)", aslist);
Py_DECREF(aslist);
Py_ReprLeave(deque);
return result;
}
-static int
-deque_tp_print(PyObject *deque, FILE *fp, int flags)
-{
- PyObject *it, *item;
- char *emit = ""; /* No separator emitted on first pass */
- char *separator = ", ";
- int i;
-
- i = Py_ReprEnter(deque);
- if (i != 0) {
- if (i < 0)
- return i;
- Py_BEGIN_ALLOW_THREADS
- fputs("[...]", fp);
- Py_END_ALLOW_THREADS
- return 0;
- }
-
- it = PyObject_GetIter(deque);
- if (it == NULL)
- return -1;
-
- Py_BEGIN_ALLOW_THREADS
- fputs("deque([", fp);
- Py_END_ALLOW_THREADS
- while ((item = PyIter_Next(it)) != NULL) {
- Py_BEGIN_ALLOW_THREADS
- fputs(emit, fp);
- Py_END_ALLOW_THREADS
- emit = separator;
- if (PyObject_Print(item, fp, 0) != 0) {
- Py_DECREF(item);
- Py_DECREF(it);
- Py_ReprLeave(deque);
- return -1;
- }
- Py_DECREF(item);
- }
- Py_ReprLeave(deque);
- Py_DECREF(it);
- if (PyErr_Occurred())
- return -1;
-
- Py_BEGIN_ALLOW_THREADS
- if (((dequeobject *)deque)->maxlen == -1)
- fputs("])", fp);
- else
- fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);
- Py_END_ALLOW_THREADS
- return 0;
-}
-
static PyObject *
deque_richcompare(PyObject *v, PyObject *w, int op)
{
@@ -971,7 +913,7 @@ deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)
if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))
return -1;
if (maxlenobj != NULL && maxlenobj != Py_None) {
- maxlen = PyInt_AsSsize_t(maxlenobj);
+ maxlen = PyLong_AsSsize_t(maxlenobj);
if (maxlen == -1 && PyErr_Occurred())
return -1;
if (maxlen < 0) {
@@ -1012,7 +954,7 @@ deque_get_maxlen(dequeobject *deque)
{
if (deque->maxlen == -1)
Py_RETURN_NONE;
- return PyInt_FromSsize_t(deque->maxlen);
+ return PyLong_FromSsize_t(deque->maxlen);
}
static PyGetSetDef deque_getset[] = {
@@ -1088,32 +1030,32 @@ static PyTypeObject deque_type = {
0, /* tp_itemsize */
/* methods */
(destructor)deque_dealloc, /* tp_dealloc */
- deque_tp_print, /* tp_print */
+ 0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
- 0, /* tp_compare */
+ 0, /* tp_reserved */
deque_repr, /* tp_repr */
0, /* tp_as_number */
&deque_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
- (hashfunc)PyObject_HashNotImplemented, /* tp_hash */
+ PyObject_HashNotImplemented, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ /* tp_flags */
deque_doc, /* tp_doc */
(traverseproc)deque_traverse, /* tp_traverse */
(inquiry)deque_clear, /* tp_clear */
(richcmpfunc)deque_richcompare, /* tp_richcompare */
- offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
+ offsetof(dequeobject, weakreflist), /* tp_weaklistoffset*/
(getiterfunc)deque_iter, /* tp_iter */
0, /* tp_iternext */
deque_methods, /* tp_methods */
0, /* tp_members */
- deque_getset, /* tp_getset */
+ deque_getset, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
@@ -1201,7 +1143,7 @@ dequeiter_next(dequeiterobject *it)
static PyObject *
dequeiter_len(dequeiterobject *it)
{
- return PyInt_FromLong(it->counter);
+ return PyLong_FromSsize_t(it->counter);
}
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
@@ -1221,7 +1163,7 @@ static PyTypeObject dequeiter_type = {
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
- 0, /* tp_compare */
+ 0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
@@ -1304,7 +1246,7 @@ static PyTypeObject dequereviter_type = {
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
- 0, /* tp_compare */
+ 0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
@@ -1410,6 +1352,7 @@ defdict_reduce(defdictobject *dd)
*/
PyObject *args;
PyObject *items;
+ PyObject *iter;
PyObject *result;
if (dd->default_factory == NULL || dd->default_factory == Py_None)
args = PyTuple_New(0);
@@ -1417,13 +1360,20 @@ defdict_reduce(defdictobject *dd)
args = PyTuple_Pack(1, dd->default_factory);
if (args == NULL)
return NULL;
- items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");
+ items = PyObject_CallMethod((PyObject *)dd, "items", "()");
if (items == NULL) {
Py_DECREF(args);
return NULL;
}
+ iter = PyObject_GetIter(items);
+ if (iter == NULL) {
+ Py_DECREF(items);
+ Py_DECREF(args);
+ return NULL;
+ }
result = PyTuple_Pack(5, Py_TYPE(dd), args,
- Py_None, Py_None, items);
+ Py_None, Py_None, iter);
+ Py_DECREF(iter);
Py_DECREF(items);
Py_DECREF(args);
return result;
@@ -1455,41 +1405,17 @@ defdict_dealloc(defdictobject *dd)
PyDict_Type.tp_dealloc((PyObject *)dd);
}
-static int
-defdict_print(defdictobject *dd, FILE *fp, int flags)
-{
- int sts;
- Py_BEGIN_ALLOW_THREADS
- fprintf(fp, "defaultdict(");
- Py_END_ALLOW_THREADS
- if (dd->default_factory == NULL) {
- Py_BEGIN_ALLOW_THREADS
- fprintf(fp, "None");
- Py_END_ALLOW_THREADS
- } else {
- PyObject_Print(dd->default_factory, fp, 0);
- }
- Py_BEGIN_ALLOW_THREADS
- fprintf(fp, ", ");
- Py_END_ALLOW_THREADS
- sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
- Py_BEGIN_ALLOW_THREADS
- fprintf(fp, ")");
- Py_END_ALLOW_THREADS
- return sts;
-}
-
static PyObject *
defdict_repr(defdictobject *dd)
{
- PyObject *defrepr;
PyObject *baserepr;
+ PyObject *defrepr;
PyObject *result;
baserepr = PyDict_Type.tp_repr((PyObject *)dd);
if (baserepr == NULL)
return NULL;
if (dd->default_factory == NULL)
- defrepr = PyString_FromString("None");
+ defrepr = PyUnicode_FromString("None");
else
{
int status = Py_ReprEnter(dd->default_factory);
@@ -1498,7 +1424,7 @@ defdict_repr(defdictobject *dd)
Py_DECREF(baserepr);
return NULL;
}
- defrepr = PyString_FromString("...");
+ defrepr = PyUnicode_FromString("...");
}
else
defrepr = PyObject_Repr(dd->default_factory);
@@ -1508,9 +1434,8 @@ defdict_repr(defdictobject *dd)
Py_DECREF(baserepr);
return NULL;
}
- result = PyString_FromFormat("defaultdict(%s, %s)",
- PyString_AS_STRING(defrepr),
- PyString_AS_STRING(baserepr));
+ result = PyUnicode_FromFormat("defaultdict(%U, %U)",
+ defrepr, baserepr);
Py_DECREF(defrepr);
Py_DECREF(baserepr);
return result;
@@ -1580,10 +1505,10 @@ static PyTypeObject defdict_type = {
0, /* tp_itemsize */
/* methods */
(destructor)defdict_dealloc, /* tp_dealloc */
- (printfunc)defdict_print, /* tp_print */
+ 0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
- 0, /* tp_compare */
+ 0, /* tp_reserved */
(reprfunc)defdict_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
@@ -1594,8 +1519,8 @@ static PyTypeObject defdict_type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ /* tp_flags */
defdict_doc, /* tp_doc */
defdict_traverse, /* tp_traverse */
(inquiry)defdict_tp_clear, /* tp_clear */
@@ -1617,6 +1542,95 @@ static PyTypeObject defdict_type = {
PyObject_GC_Del, /* tp_free */
};
+/* helper function for Counter *********************************************/
+
+PyDoc_STRVAR(_count_elements_doc,
+"_count_elements(mapping, iterable) -> None\n\
+\n\
+Count elements in the iterable, updating the mappping");
+
+static PyObject *
+_count_elements(PyObject *self, PyObject *args)
+{
+ PyObject *it, *iterable, *mapping, *oldval;
+ PyObject *newval = NULL;
+ PyObject *key = NULL;
+ PyObject *one = NULL;
+
+ if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable))
+ return NULL;
+
+ it = PyObject_GetIter(iterable);
+ if (it == NULL)
+ return NULL;
+
+ one = PyLong_FromLong(1);
+ if (one == NULL) {
+ Py_DECREF(it);
+ return NULL;
+ }
+
+ if (PyDict_CheckExact(mapping)) {
+ while (1) {
+ key = PyIter_Next(it);
+ if (key == NULL) {
+ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ break;
+ }
+ oldval = PyDict_GetItem(mapping, key);
+ if (oldval == NULL) {
+ if (PyDict_SetItem(mapping, key, one) == -1)
+ break;
+ } else {
+ newval = PyNumber_Add(oldval, one);
+ if (newval == NULL)
+ break;
+ if (PyDict_SetItem(mapping, key, newval) == -1)
+ break;
+ Py_CLEAR(newval);
+ }
+ Py_DECREF(key);
+ }
+ } else {
+ while (1) {
+ key = PyIter_Next(it);
+ if (key == NULL) {
+ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ break;
+ }
+ oldval = PyObject_GetItem(mapping, key);
+ if (oldval == NULL) {
+ if (!PyErr_Occurred() || !PyErr_ExceptionMatches(PyExc_KeyError))
+ break;
+ PyErr_Clear();
+ Py_INCREF(one);
+ newval = one;
+ } else {
+ newval = PyNumber_Add(oldval, one);
+ Py_DECREF(oldval);
+ if (newval == NULL)
+ break;
+ }
+ if (PyObject_SetItem(mapping, key, newval) == -1)
+ break;
+ Py_CLEAR(newval);
+ Py_DECREF(key);
+ }
+ }
+
+ Py_DECREF(it);
+ Py_XDECREF(key);
+ Py_XDECREF(newval);
+ Py_DECREF(one);
+ if (PyErr_Occurred())
+ return NULL;
+ Py_RETURN_NONE;
+}
+
/* module level code ********************************************************/
PyDoc_STRVAR(module_doc,
@@ -1625,31 +1639,48 @@ PyDoc_STRVAR(module_doc,
- defaultdict: dict subclass with a default value factory\n\
");
+static struct PyMethodDef module_functions[] = {
+ {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+static struct PyModuleDef _collectionsmodule = {
+ PyModuleDef_HEAD_INIT,
+ "_collections",
+ module_doc,
+ -1,
+ module_functions,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
PyMODINIT_FUNC
-init_collections(void)
+PyInit__collections(void)
{
PyObject *m;
- m = Py_InitModule3("_collections", NULL, module_doc);
+ m = PyModule_Create(&_collectionsmodule);
if (m == NULL)
- return;
+ return NULL;
if (PyType_Ready(&deque_type) < 0)
- return;
+ return NULL;
Py_INCREF(&deque_type);
PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
defdict_type.tp_base = &PyDict_Type;
if (PyType_Ready(&defdict_type) < 0)
- return;
+ return NULL;
Py_INCREF(&defdict_type);
PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
if (PyType_Ready(&dequeiter_type) < 0)
- return;
+ return NULL;
if (PyType_Ready(&dequereviter_type) < 0)
- return;
+ return NULL;
- return;
+ return m;
}