From 76d982ef343dcadd35355aed9c568984c850fb7b Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 13 Jan 2014 19:19:16 +0200 Subject: type->print(): Distinguish str() and repr() variety by passing extra param. --- py/builtin.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'py/builtin.c') diff --git a/py/builtin.c b/py/builtin.c index 8f93e843b..a45b1463d 100644 --- a/py/builtin.c +++ b/py/builtin.c @@ -64,7 +64,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR(mp_builtin___build_class___obj, 2, mp_builtin___buil static mp_obj_t mp_builtin___repl_print__(mp_obj_t o) { if (o != mp_const_none) { - mp_obj_print(o); + mp_obj_print(o, PRINT_REPR); printf("\n"); } return mp_const_none; @@ -285,13 +285,7 @@ static mp_obj_t mp_builtin_print(int n_args, const mp_obj_t *args) { if (i > 0) { printf(" "); } - if (MP_OBJ_IS_TYPE(args[i], &str_type)) { - // special case, print string raw - printf("%s", qstr_str(mp_obj_str_get(args[i]))); - } else { - // print the object Python style - mp_obj_print(args[i]); - } + mp_obj_print(args[i], PRINT_STR); } printf("\n"); return mp_const_none; -- cgit v1.2.3 From 36c4499d36a36ab3e1a68545e613bce61fb15f3c Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 13 Jan 2014 19:20:46 +0200 Subject: Implement str() and repr() builtin functions. --- py/builtin.c | 16 ++++++++++++++++ py/builtin.h | 2 ++ py/misc.h | 2 ++ py/mpqstrraw.h | 2 ++ py/runtime.c | 2 ++ 5 files changed, 24 insertions(+) (limited to 'py/builtin.c') diff --git a/py/builtin.c b/py/builtin.c index a45b1463d..bc10f29d7 100644 --- a/py/builtin.c +++ b/py/builtin.c @@ -338,3 +338,19 @@ static mp_obj_t mp_builtin_sorted(mp_obj_t args, mp_map_t *kwargs) { return self; } MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_sorted_obj, 1, mp_builtin_sorted); + +mp_obj_t mp_builtin_str(mp_obj_t o) { + vstr_t *vstr = vstr_new(); + mp_obj_print_helper(vstr_printf_wrapper, vstr, o, PRINT_STR); + return mp_obj_new_str(qstr_from_str_take(vstr->buf, vstr->alloc)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_str_obj, mp_builtin_str); + +mp_obj_t mp_builtin_repr(mp_obj_t o) { + vstr_t *vstr = vstr_new(); + mp_obj_print_helper(vstr_printf_wrapper, vstr, o, PRINT_REPR); + return mp_obj_new_str(qstr_from_str_take(vstr->buf, vstr->alloc)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_repr_obj, mp_builtin_repr); diff --git a/py/builtin.h b/py/builtin.h index 3401528a6..0716b952e 100644 --- a/py/builtin.h +++ b/py/builtin.h @@ -23,3 +23,5 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_print_obj); MP_DECLARE_CONST_FUN_OBJ(mp_builtin_range_obj); MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sorted_obj); MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sum_obj); +MP_DECLARE_CONST_FUN_OBJ(mp_builtin_str_obj); +MP_DECLARE_CONST_FUN_OBJ(mp_builtin_repr_obj); diff --git a/py/misc.h b/py/misc.h index e985bc525..8c2c85491 100644 --- a/py/misc.h +++ b/py/misc.h @@ -81,6 +81,8 @@ void vstr_add_strn(vstr_t *vstr, const char *str, int len); //void vstr_add_le32(vstr_t *vstr, unsigned int v); void vstr_cut_tail(vstr_t *vstr, int len); void vstr_printf(vstr_t *vstr, const char *fmt, ...); +// TODO: do we need wrapper at all? +void vstr_printf_wrapper(void *env, const char *fmt, ...); #ifdef va_start void vstr_vprintf(vstr_t *vstr, const char *fmt, va_list ap); diff --git a/py/mpqstrraw.h b/py/mpqstrraw.h index c3cda84b4..615c9da99 100644 --- a/py/mpqstrraw.h +++ b/py/mpqstrraw.h @@ -56,9 +56,11 @@ Q(ord) Q(pow) Q(print) Q(range) +Q(repr) Q(set) Q(sorted) Q(sum) +Q(str) Q(tuple) Q(type) Q(zip) diff --git a/py/runtime.c b/py/runtime.c index 3d8f0c9a7..3f7595787 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -136,6 +136,8 @@ void rt_init(void) { mp_map_add_qstr(&map_builtins, MP_QSTR_range, (mp_obj_t)&mp_builtin_range_obj); mp_map_add_qstr(&map_builtins, MP_QSTR_sorted, (mp_obj_t)&mp_builtin_sorted_obj); mp_map_add_qstr(&map_builtins, MP_QSTR_sum, (mp_obj_t)&mp_builtin_sum_obj); + mp_map_add_qstr(&map_builtins, MP_QSTR_str, (mp_obj_t)&mp_builtin_str_obj); + mp_map_add_qstr(&map_builtins, MP_QSTR_repr, (mp_obj_t)&mp_builtin_repr_obj); next_unique_code_id = 1; // 0 indicates "no code" unique_codes_alloc = 0; -- cgit v1.2.3