Skip to content

Commit 71b6a85

Browse files
committed
py/objtuple: Make mp_obj_tuple_get an inline function.
This can be done now that it's declared in `py/objtuple.h`, where the `mp_obj_tuple` struct is defined. This allows much better code generation for users of `mp_obj_tuple_get()` where the caller uses len/items immediately (which is most uses), because the compiler no longer needs to allocate the return values on the stack. Changes code size by -36 bytes on bare-arm and -56 bytes on stm32. Signed-off-by: Damien George <damien@micropython.org>
1 parent 90f259f commit 71b6a85

2 files changed

Lines changed: 11 additions & 11 deletions

File tree

py/objtuple.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,6 @@ mp_obj_t mp_obj_new_tuple(size_t n, const mp_obj_t *items) {
251251
return MP_OBJ_FROM_PTR(o);
252252
}
253253

254-
void mp_obj_tuple_get(mp_obj_t self_in, size_t *len, mp_obj_t **items) {
255-
assert(mp_obj_is_tuple_compatible(self_in));
256-
mp_obj_tuple_t *self = MP_OBJ_TO_PTR(self_in);
257-
*len = self->len;
258-
*items = &self->items[0];
259-
}
260-
261254
void mp_obj_tuple_del(mp_obj_t self_in) {
262255
assert(mp_obj_is_type(self_in, &mp_type_tuple));
263256
mp_obj_tuple_t *self = MP_OBJ_TO_PTR(self_in);

py/objtuple.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828

2929
#include "py/obj.h"
3030

31+
// type check is done on getiter method to allow tuple, namedtuple, attrtuple
32+
#define mp_obj_is_tuple_compatible(o) (MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_obj_get_type(o), iter) == mp_obj_tuple_getiter)
33+
3134
typedef struct _mp_obj_tuple_t {
3235
mp_obj_base_t base;
3336
size_t len;
@@ -45,7 +48,14 @@ mp_obj_t mp_obj_tuple_unary_op(mp_unary_op_t op, mp_obj_t self_in);
4548
mp_obj_t mp_obj_tuple_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs);
4649
mp_obj_t mp_obj_tuple_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value);
4750
mp_obj_t mp_obj_tuple_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf);
48-
void mp_obj_tuple_get(mp_obj_t self_in, size_t *len, mp_obj_t **items);
51+
52+
static inline void mp_obj_tuple_get(mp_obj_t self_in, size_t *len, mp_obj_t **items) {
53+
assert(mp_obj_is_tuple_compatible(self_in));
54+
mp_obj_tuple_t *self = (mp_obj_tuple_t *)MP_OBJ_TO_PTR(self_in);
55+
*len = self->len;
56+
*items = &self->items[0];
57+
}
58+
4959
void mp_obj_tuple_del(mp_obj_t self_in);
5060

5161
extern const mp_obj_type_t mp_type_attrtuple;
@@ -63,7 +73,4 @@ void mp_obj_attrtuple_print_helper(const mp_print_t *print, const qstr *fields,
6373

6474
mp_obj_t mp_obj_new_attrtuple(const qstr *fields, size_t n, const mp_obj_t *items);
6575

66-
// type check is done on getiter method to allow tuple, namedtuple, attrtuple
67-
#define mp_obj_is_tuple_compatible(o) (MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_obj_get_type(o), iter) == mp_obj_tuple_getiter)
68-
6976
#endif // MICROPY_INCLUDED_PY_OBJTUPLE_H

0 commit comments

Comments
 (0)