@@ -210,8 +210,9 @@ STATIC mp_obj_t dict_it_iternext(mp_obj_t self_in) {
210210 }
211211}
212212
213- STATIC mp_obj_t dict_getiter (mp_obj_t self_in ) {
214- mp_obj_dict_it_t * o = m_new_obj (mp_obj_dict_it_t );
213+ STATIC mp_obj_t dict_getiter (mp_obj_t self_in , mp_obj_iter_buf_t * iter_buf ) {
214+ assert (sizeof (mp_obj_dict_it_t ) <= sizeof (mp_obj_iter_buf_t ));
215+ mp_obj_dict_it_t * o = (mp_obj_dict_it_t * )iter_buf ;
215216 o -> base .type = & mp_type_polymorph_iter ;
216217 o -> iternext = dict_it_iternext ;
217218 o -> dict = self_in ;
@@ -249,7 +250,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(dict_copy_obj, dict_copy);
249250
250251// this is a classmethod
251252STATIC mp_obj_t dict_fromkeys (size_t n_args , const mp_obj_t * args ) {
252- mp_obj_t iter = mp_getiter (args [1 ]);
253+ mp_obj_iter_buf_t iter_buf ;
254+ mp_obj_t iter = mp_getiter (args [1 ], & iter_buf );
253255 mp_obj_t value = mp_const_none ;
254256 mp_obj_t next = MP_OBJ_NULL ;
255257
@@ -375,10 +377,12 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg
375377 }
376378 } else {
377379 // update from a generic iterable of pairs
378- mp_obj_t iter = mp_getiter (args [1 ]);
380+ mp_obj_iter_buf_t iter_buf ;
381+ mp_obj_t iter = mp_getiter (args [1 ], & iter_buf );
379382 mp_obj_t next = MP_OBJ_NULL ;
380383 while ((next = mp_iternext (iter )) != MP_OBJ_STOP_ITERATION ) {
381- mp_obj_t inneriter = mp_getiter (next );
384+ mp_obj_iter_buf_t inner_iter_buf ;
385+ mp_obj_t inneriter = mp_getiter (next , & inner_iter_buf );
382386 mp_obj_t key = mp_iternext (inneriter );
383387 mp_obj_t value = mp_iternext (inneriter );
384388 mp_obj_t stop = mp_iternext (inneriter );
@@ -457,14 +461,15 @@ STATIC mp_obj_t dict_view_it_iternext(mp_obj_t self_in) {
457461STATIC const mp_obj_type_t dict_view_it_type = {
458462 { & mp_type_type },
459463 .name = MP_QSTR_iterator ,
460- .getiter = mp_identity ,
464+ .getiter = mp_identity_getiter ,
461465 .iternext = dict_view_it_iternext ,
462466};
463467
464- STATIC mp_obj_t dict_view_getiter (mp_obj_t view_in ) {
468+ STATIC mp_obj_t dict_view_getiter (mp_obj_t view_in , mp_obj_iter_buf_t * iter_buf ) {
469+ assert (sizeof (mp_obj_dict_view_it_t ) <= sizeof (mp_obj_iter_buf_t ));
465470 mp_check_self (MP_OBJ_IS_TYPE (view_in , & dict_view_type ));
466471 mp_obj_dict_view_t * view = MP_OBJ_TO_PTR (view_in );
467- mp_obj_dict_view_it_t * o = m_new_obj (mp_obj_dict_view_it_t ) ;
472+ mp_obj_dict_view_it_t * o = (mp_obj_dict_view_it_t * ) iter_buf ;
468473 o -> base .type = & dict_view_it_type ;
469474 o -> kind = view -> kind ;
470475 o -> dict = view -> dict ;
@@ -479,7 +484,8 @@ STATIC void dict_view_print(const mp_print_t *print, mp_obj_t self_in, mp_print_
479484 bool first = true;
480485 mp_print_str (print , mp_dict_view_names [self -> kind ]);
481486 mp_print_str (print , "([" );
482- mp_obj_t self_iter = dict_view_getiter (self_in );
487+ mp_obj_iter_buf_t iter_buf ;
488+ mp_obj_t self_iter = dict_view_getiter (self_in , & iter_buf );
483489 mp_obj_t next = MP_OBJ_NULL ;
484490 while ((next = dict_view_it_iternext (self_iter )) != MP_OBJ_STOP_ITERATION ) {
485491 if (!first ) {
0 commit comments