@@ -49,6 +49,7 @@ typedef struct _mp_obj_btree_t {
4949 #define FLAG_ITER_VALUES 0x80
5050 #define FLAG_ITER_ITEMS 0xc0
5151 byte flags ;
52+ byte next_flags ;
5253} mp_obj_btree_t ;
5354
5455STATIC const mp_obj_type_t btree_type ;
@@ -66,9 +67,9 @@ STATIC mp_obj_btree_t *btree_new(DB *db) {
6667 mp_obj_btree_t * o = m_new_obj (mp_obj_btree_t );
6768 o -> base .type = & btree_type ;
6869 o -> db = db ;
69- o -> start_key = MP_OBJ_NULL ;
70- o -> end_key = MP_OBJ_NULL ;
71- o -> flags = 0 ;
70+ o -> start_key = mp_const_none ;
71+ o -> end_key = mp_const_none ;
72+ o -> next_flags = 0 ;
7273 return o ;
7374}
7475
@@ -132,15 +133,15 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(btree_seq_obj, 2, 4, btree_seq);
132133
133134STATIC mp_obj_t btree_init_iter (size_t n_args , const mp_obj_t * args , byte type ) {
134135 mp_obj_btree_t * self = MP_OBJ_TO_PTR (args [0 ]);
135- self -> flags = type ;
136+ self -> next_flags = type ;
136137 self -> start_key = mp_const_none ;
137138 self -> end_key = mp_const_none ;
138139 if (n_args > 1 ) {
139140 self -> start_key = args [1 ];
140141 if (n_args > 2 ) {
141142 self -> end_key = args [2 ];
142143 if (n_args > 3 ) {
143- self -> flags |= MP_OBJ_SMALL_INT_VALUE (args [3 ]);
144+ self -> next_flags = type | MP_OBJ_SMALL_INT_VALUE (args [3 ]);
144145 }
145146 }
146147 }
@@ -162,6 +163,23 @@ STATIC mp_obj_t btree_items(size_t n_args, const mp_obj_t *args) {
162163}
163164STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (btree_items_obj , 1 , 4 , btree_items );
164165
166+ STATIC mp_obj_t btree_getiter (mp_obj_t self_in ) {
167+ mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
168+ if (self -> next_flags != 0 ) {
169+ // If we're called immediately after keys(), values(), or items(),
170+ // use their setup for iteration.
171+ self -> flags = self -> next_flags ;
172+ self -> next_flags = 0 ;
173+ } else {
174+ // Otherwise, iterate over all keys.
175+ self -> flags = FLAG_ITER_KEYS ;
176+ self -> start_key = mp_const_none ;
177+ self -> end_key = mp_const_none ;
178+ }
179+
180+ return self_in ;
181+ }
182+
165183STATIC mp_obj_t btree_iternext (mp_obj_t self_in ) {
166184 mp_obj_btree_t * self = MP_OBJ_TO_PTR (self_in );
167185 DBT key , val ;
@@ -267,7 +285,7 @@ STATIC const mp_obj_type_t btree_type = {
267285 // Save on qstr's, reuse same as for module
268286 .name = MP_QSTR_btree ,
269287 .print = btree_print ,
270- .getiter = mp_identity ,
288+ .getiter = btree_getiter ,
271289 .iternext = btree_iternext ,
272290 .subscr = btree_subscr ,
273291 .locals_dict = (void * )& btree_locals_dict ,
0 commit comments