summaryrefslogtreecommitdiff
path: root/Objects/enumobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/enumobject.c')
-rw-r--r--Objects/enumobject.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 230dba294d..0bacc8346c 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -15,18 +15,36 @@ enum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
enumobject *en;
PyObject *seq = NULL;
- static char *kwlist[] = {"sequence", 0};
+ PyObject *start = NULL;
+ static char *kwlist[] = {"sequence", "start", 0};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:enumerate", kwlist,
- &seq))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist,
+ &seq, &start))
return NULL;
en = (enumobject *)type->tp_alloc(type, 0);
if (en == NULL)
return NULL;
- en->en_index = 0;
+ if (start) {
+ start = PyNumber_Index(start);
+ if (start == NULL) {
+ Py_DECREF(en);
+ return NULL;
+ }
+ if (PyLong_Check(start)) {
+ en->en_index = LONG_MAX;
+ en->en_longindex = start;
+ } else {
+ assert(PyInt_Check(start));
+ en->en_index = PyInt_AsLong(start);
+ en->en_longindex = NULL;
+ Py_DECREF(start);
+ }
+ } else {
+ en->en_index = 0;
+ en->en_longindex = NULL;
+ }
en->en_sit = PyObject_GetIter(seq);
- en->en_longindex = NULL;
if (en->en_sit == NULL) {
Py_DECREF(en);
return NULL;