diff options
author | Damien George <damien.p.george@gmail.com> | 2015-04-09 23:56:15 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-04-16 14:30:16 +0000 |
commit | 7f9d1d6ab923096582622b700bedb6a571518eac (patch) | |
tree | f97a0d56ba0279dd4ef2a44f00676193c4d49d8b /py/objdict.c | |
parent | 56beb01724d4f0027babc5d23f016efbde4c4190 (diff) |
py: Overhaul and simplify printf/pfenv mechanism.
Previous to this patch the printing mechanism was a bit of a tangled
mess. This patch attempts to consolidate printing into one interface.
All (non-debug) printing now uses the mp_print* family of functions,
mainly mp_printf. All these functions take an mp_print_t structure as
their first argument, and this structure defines the printing backend
through the "print_strn" function of said structure.
Printing from the uPy core can reach the platform-defined print code via
two paths: either through mp_sys_stdout_obj (defined pert port) in
conjunction with mp_stream_write; or through the mp_plat_print structure
which uses the MP_PLAT_PRINT_STRN macro to define how string are printed
on the platform. The former is only used when MICROPY_PY_IO is defined.
With this new scheme printing is generally more efficient (less layers
to go through, less arguments to pass), and, given an mp_print_t*
structure, one can call mp_print_str for efficiency instead of
mp_printf("%s", ...). Code size is also reduced by around 200 bytes on
Thumb2 archs.
Diffstat (limited to 'py/objdict.c')
-rw-r--r-- | py/objdict.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/py/objdict.c b/py/objdict.c index 3e255ec88..23024d549 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -55,30 +55,30 @@ STATIC mp_map_elem_t *dict_iter_next(mp_obj_dict_t *dict, mp_uint_t *cur) { return NULL; } -STATIC void dict_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { +STATIC void dict_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { mp_obj_dict_t *self = MP_OBJ_CAST(self_in); bool first = true; if (!(MICROPY_PY_UJSON && kind == PRINT_JSON)) { kind = PRINT_REPR; } if (MICROPY_PY_COLLECTIONS_ORDEREDDICT && self->base.type != &mp_type_dict) { - print(env, "%s(", qstr_str(self->base.type->name)); + mp_printf(print, "%s(", qstr_str(self->base.type->name)); } - print(env, "{"); + mp_print_str(print, "{"); mp_uint_t cur = 0; mp_map_elem_t *next = NULL; while ((next = dict_iter_next(self, &cur)) != NULL) { if (!first) { - print(env, ", "); + mp_print_str(print, ", "); } first = false; - mp_obj_print_helper(print, env, next->key, kind); - print(env, ": "); - mp_obj_print_helper(print, env, next->value, kind); + mp_obj_print_helper(print, next->key, kind); + mp_print_str(print, ": "); + mp_obj_print_helper(print, next->value, kind); } - print(env, "}"); + mp_print_str(print, "}"); if (MICROPY_PY_COLLECTIONS_ORDEREDDICT && self->base.type != &mp_type_dict) { - print(env, ")"); + mp_print_str(print, ")"); } } @@ -473,23 +473,23 @@ STATIC mp_obj_t dict_view_getiter(mp_obj_t view_in) { return o_out; } -STATIC void dict_view_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { +STATIC void dict_view_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { (void)kind; assert(MP_OBJ_IS_TYPE(self_in, &dict_view_type)); mp_obj_dict_view_t *self = MP_OBJ_CAST(self_in); bool first = true; - print(env, mp_dict_view_names[self->kind]); - print(env, "(["); + mp_print_str(print, mp_dict_view_names[self->kind]); + mp_print_str(print, "(["); mp_obj_t self_iter = dict_view_getiter(self_in); mp_obj_t next = MP_OBJ_NULL; while ((next = dict_view_it_iternext(self_iter)) != MP_OBJ_STOP_ITERATION) { if (!first) { - print(env, ", "); + mp_print_str(print, ", "); } first = false; - mp_obj_print_helper(print, env, next, PRINT_REPR); + mp_obj_print_helper(print, next, PRINT_REPR); } - print(env, "])"); + mp_print_str(print, "])"); } STATIC mp_obj_t dict_view_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) { |