Skip to content

Commit 8212d97

Browse files
committed
py: Use polymorphic iterator type where possible to reduce code size.
Only types whose iterator instances still fit in 4 machine words have been changed to use the polymorphic iterator. Reduces Thumb2 arch code size by 264 bytes.
1 parent 17f324b commit 8212d97

6 files changed

Lines changed: 20 additions & 57 deletions

File tree

py/objdict.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ STATIC mp_obj_t dict_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
186186

187187
typedef struct _mp_obj_dict_it_t {
188188
mp_obj_base_t base;
189+
mp_fun_1_t iternext;
189190
mp_obj_t dict;
190191
mp_uint_t cur;
191192
} mp_obj_dict_it_t;
@@ -201,16 +202,10 @@ STATIC mp_obj_t dict_it_iternext(mp_obj_t self_in) {
201202
}
202203
}
203204

204-
STATIC const mp_obj_type_t mp_type_dict_it = {
205-
{ &mp_type_type },
206-
.name = MP_QSTR_iterator,
207-
.getiter = mp_identity,
208-
.iternext = dict_it_iternext,
209-
};
210-
211205
STATIC mp_obj_t dict_getiter(mp_obj_t self_in) {
212206
mp_obj_dict_it_t *o = m_new_obj(mp_obj_dict_it_t);
213-
o->base.type = &mp_type_dict_it;
207+
o->base.type = &mp_type_polymorph_iter;
208+
o->iternext = dict_it_iternext;
214209
o->dict = self_in;
215210
o->cur = 0;
216211
return MP_OBJ_FROM_PTR(o);

py/objlist.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ void mp_obj_list_store(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
498498

499499
typedef struct _mp_obj_list_it_t {
500500
mp_obj_base_t base;
501+
mp_fun_1_t iternext;
501502
mp_obj_t list;
502503
mp_uint_t cur;
503504
} mp_obj_list_it_t;
@@ -514,16 +515,10 @@ STATIC mp_obj_t list_it_iternext(mp_obj_t self_in) {
514515
}
515516
}
516517

517-
STATIC const mp_obj_type_t mp_type_list_it = {
518-
{ &mp_type_type },
519-
.name = MP_QSTR_iterator,
520-
.getiter = mp_identity,
521-
.iternext = list_it_iternext,
522-
};
523-
524518
mp_obj_t mp_obj_new_list_iterator(mp_obj_t list, mp_uint_t cur) {
525519
mp_obj_list_it_t *o = m_new_obj(mp_obj_list_it_t);
526-
o->base.type = &mp_type_list_it;
520+
o->base.type = &mp_type_polymorph_iter;
521+
o->iternext = list_it_iternext;
527522
o->list = list;
528523
o->cur = cur;
529524
return MP_OBJ_FROM_PTR(o);

py/objset.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ typedef struct _mp_obj_set_t {
4242

4343
typedef struct _mp_obj_set_it_t {
4444
mp_obj_base_t base;
45+
mp_fun_1_t iternext;
4546
mp_obj_set_t *set;
4647
mp_uint_t cur;
4748
} mp_obj_set_it_t;
@@ -146,15 +147,7 @@ STATIC mp_obj_t set_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw,
146147
}
147148
}
148149

149-
const mp_obj_type_t mp_type_set_it = {
150-
{ &mp_type_type },
151-
.name = MP_QSTR_iterator,
152-
.getiter = mp_identity,
153-
.iternext = set_it_iternext,
154-
};
155-
156150
STATIC mp_obj_t set_it_iternext(mp_obj_t self_in) {
157-
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_set_it));
158151
mp_obj_set_it_t *self = MP_OBJ_TO_PTR(self_in);
159152
mp_uint_t max = self->set->set.alloc;
160153
mp_set_t *set = &self->set->set;
@@ -171,7 +164,8 @@ STATIC mp_obj_t set_it_iternext(mp_obj_t self_in) {
171164

172165
STATIC mp_obj_t set_getiter(mp_obj_t set_in) {
173166
mp_obj_set_it_t *o = m_new_obj(mp_obj_set_it_t);
174-
o->base.type = &mp_type_set_it;
167+
o->base.type = &mp_type_polymorph_iter;
168+
o->iternext = set_it_iternext;
175169
o->set = (mp_obj_set_t *)MP_OBJ_TO_PTR(set_in);
176170
o->cur = 0;
177171
return MP_OBJ_FROM_PTR(o);

py/objstr.c

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,6 +2061,7 @@ const byte *mp_obj_str_get_data_no_check(mp_obj_t self_in, size_t *len) {
20612061

20622062
typedef struct _mp_obj_str8_it_t {
20632063
mp_obj_base_t base;
2064+
mp_fun_1_t iternext;
20642065
mp_obj_t str;
20652066
mp_uint_t cur;
20662067
} mp_obj_str8_it_t;
@@ -2078,16 +2079,10 @@ STATIC mp_obj_t str_it_iternext(mp_obj_t self_in) {
20782079
}
20792080
}
20802081

2081-
STATIC const mp_obj_type_t mp_type_str_it = {
2082-
{ &mp_type_type },
2083-
.name = MP_QSTR_iterator,
2084-
.getiter = mp_identity,
2085-
.iternext = str_it_iternext,
2086-
};
2087-
20882082
STATIC mp_obj_t mp_obj_new_str_iterator(mp_obj_t str) {
20892083
mp_obj_str8_it_t *o = m_new_obj(mp_obj_str8_it_t);
2090-
o->base.type = &mp_type_str_it;
2084+
o->base.type = &mp_type_polymorph_iter;
2085+
o->iternext = str_it_iternext;
20912086
o->str = str;
20922087
o->cur = 0;
20932088
return o;
@@ -2106,16 +2101,10 @@ STATIC mp_obj_t bytes_it_iternext(mp_obj_t self_in) {
21062101
}
21072102
}
21082103

2109-
STATIC const mp_obj_type_t mp_type_bytes_it = {
2110-
{ &mp_type_type },
2111-
.name = MP_QSTR_iterator,
2112-
.getiter = mp_identity,
2113-
.iternext = bytes_it_iternext,
2114-
};
2115-
21162104
mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str) {
21172105
mp_obj_str8_it_t *o = m_new_obj(mp_obj_str8_it_t);
2118-
o->base.type = &mp_type_bytes_it;
2106+
o->base.type = &mp_type_polymorph_iter;
2107+
o->iternext = bytes_it_iternext;
21192108
o->str = str;
21202109
o->cur = 0;
21212110
return MP_OBJ_FROM_PTR(o);

py/objstrunicode.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ const mp_obj_type_t mp_type_str = {
267267

268268
typedef struct _mp_obj_str_it_t {
269269
mp_obj_base_t base;
270+
mp_fun_1_t iternext;
270271
mp_obj_t str;
271272
mp_uint_t cur;
272273
} mp_obj_str_it_t;
@@ -285,16 +286,10 @@ STATIC mp_obj_t str_it_iternext(mp_obj_t self_in) {
285286
}
286287
}
287288

288-
STATIC const mp_obj_type_t mp_type_str_it = {
289-
{ &mp_type_type },
290-
.name = MP_QSTR_iterator,
291-
.getiter = mp_identity,
292-
.iternext = str_it_iternext,
293-
};
294-
295289
STATIC mp_obj_t mp_obj_new_str_iterator(mp_obj_t str) {
296290
mp_obj_str_it_t *o = m_new_obj(mp_obj_str_it_t);
297-
o->base.type = &mp_type_str_it;
291+
o->base.type = &mp_type_polymorph_iter;
292+
o->iternext = str_it_iternext;
298293
o->str = str;
299294
o->cur = 0;
300295
return MP_OBJ_FROM_PTR(o);

py/objtuple.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ void mp_obj_tuple_del(mp_obj_t self_in) {
270270

271271
typedef struct _mp_obj_tuple_it_t {
272272
mp_obj_base_t base;
273+
mp_fun_1_t iternext;
273274
mp_obj_tuple_t *tuple;
274275
mp_uint_t cur;
275276
} mp_obj_tuple_it_t;
@@ -285,16 +286,10 @@ STATIC mp_obj_t tuple_it_iternext(mp_obj_t self_in) {
285286
}
286287
}
287288

288-
STATIC const mp_obj_type_t mp_type_tuple_it = {
289-
{ &mp_type_type },
290-
.name = MP_QSTR_iterator,
291-
.getiter = mp_identity,
292-
.iternext = tuple_it_iternext,
293-
};
294-
295289
STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, mp_uint_t cur) {
296290
mp_obj_tuple_it_t *o = m_new_obj(mp_obj_tuple_it_t);
297-
o->base.type = &mp_type_tuple_it;
291+
o->base.type = &mp_type_polymorph_iter;
292+
o->iternext = tuple_it_iternext;
298293
o->tuple = tuple;
299294
o->cur = cur;
300295
return MP_OBJ_FROM_PTR(o);

0 commit comments

Comments
 (0)