int di_used;
int di_pos;
PyObject* di_result; /* reusable result tuple for iteritems */
+ long len;
} dictiterobject;
static PyObject *
di->di_dict = dict;
di->di_used = dict->ma_used;
di->di_pos = 0;
+ di->len = dict->ma_used;
if (itertype == &PyDictIterItem_Type) {
di->di_result = PyTuple_Pack(2, Py_None, Py_None);
if (di->di_result == NULL) {
PyObject_Del(di);
}
+static int
+dictiter_len(dictiterobject *di)
+{
+ return di->len;
+}
+
+static PySequenceMethods dictiter_as_sequence = {
+ (inquiry)dictiter_len, /* sq_length */
+ 0, /* sq_concat */
+};
+
static PyObject *dictiter_iternextkey(dictiterobject *di)
{
PyObject *key;
di->di_pos = i+1;
if (i > mask)
goto fail;
+ di->len--;
key = ep[i].me_key;
Py_INCREF(key);
return key;
PyTypeObject PyDictIterKey_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /* ob_size */
- "dictionary-keyiterator", /* tp_name */
+ "dictionary-keyiterator", /* tp_name */
sizeof(dictiterobject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
- 0, /* tp_as_sequence */
+ &dictiter_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
di->di_pos = i+1;
if (i > mask)
goto fail;
+ di->len--;
Py_INCREF(value);
return value;
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
- 0, /* tp_as_sequence */
+ &dictiter_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
if (result == NULL)
return NULL;
}
+ di->len--;
key = ep[i].me_key;
value = ep[i].me_value;
Py_INCREF(key);
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
- 0, /* tp_as_sequence */
+ &dictiter_as_sequence, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */