summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/builtin.c20
-rw-r--r--py/builtin.h1
-rw-r--r--py/mpqstrraw.h1
-rw-r--r--py/obj.c8
-rw-r--r--py/obj.h10
-rw-r--r--py/objbool.c2
-rw-r--r--py/objcomplex.c2
-rw-r--r--py/objdict.c10
-rw-r--r--py/objexcept.c18
-rw-r--r--py/objfloat.c2
-rw-r--r--py/objgenerator.c2
-rw-r--r--py/objint.c2
-rw-r--r--py/objint.h2
-rw-r--r--py/objlist.c4
-rw-r--r--py/objmodule.c2
-rw-r--r--py/objnone.c2
-rw-r--r--py/objset.c4
-rw-r--r--py/objslice.c4
-rw-r--r--py/objstr.c20
-rw-r--r--py/objtuple.c4
-rw-r--r--py/objtuple.h2
-rw-r--r--py/objtype.c4
-rw-r--r--py/runtime.c1
23 files changed, 73 insertions, 54 deletions
diff --git a/py/builtin.c b/py/builtin.c
index 837a9b2d09..04bb2681db 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;
@@ -283,13 +283,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;
@@ -310,7 +304,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_range_obj, 1, 3, mp_builtin_range
static mp_obj_t mp_builtin_repr(mp_obj_t o_in) {
vstr_t *vstr = vstr_new();
- mp_obj_print_helper((void (*)(void *env, const char *fmt, ...))vstr_printf, vstr, o_in);
+ mp_obj_print_helper((void (*)(void *env, const char *fmt, ...))vstr_printf, vstr, o_in, PRINT_REPR);
return mp_obj_new_str(qstr_from_str_take(vstr->buf, vstr->alloc));
}
@@ -352,3 +346,11 @@ static mp_obj_t mp_builtin_sorted(mp_obj_t args, mp_map_t *kwargs) {
}
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_sorted_obj, 1, mp_builtin_sorted);
+
+static mp_obj_t mp_builtin_str(mp_obj_t o_in) {
+ vstr_t *vstr = vstr_new();
+ mp_obj_print_helper((void (*)(void*, const char*, ...))vstr_printf, vstr, o_in, 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);
diff --git a/py/builtin.h b/py/builtin.h
index 7d001341ae..f4038b47b4 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -25,3 +25,4 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_range_obj);
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_repr_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);
diff --git a/py/mpqstrraw.h b/py/mpqstrraw.h
index 356c911238..6674a2c398 100644
--- a/py/mpqstrraw.h
+++ b/py/mpqstrraw.h
@@ -65,6 +65,7 @@ Q(repr)
Q(set)
Q(sorted)
Q(sum)
+Q(str)
Q(tuple)
Q(type)
Q(zip)
diff --git a/py/obj.c b/py/obj.c
index 206bf7a24a..9ca3d5d16b 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -41,21 +41,21 @@ void printf_wrapper(void *env, const char *fmt, ...) {
va_end(args);
}
-void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
if (MP_OBJ_IS_SMALL_INT(o_in)) {
print(env, "%d", (int)MP_OBJ_SMALL_INT_VALUE(o_in));
} else {
mp_obj_base_t *o = o_in;
if (o->type->print != NULL) {
- o->type->print(print, env, o_in);
+ o->type->print(print, env, o_in, kind);
} else {
print(env, "<%s>", o->type->name);
}
}
}
-void mp_obj_print(mp_obj_t o_in) {
- mp_obj_print_helper(printf_wrapper, NULL, o_in);
+void mp_obj_print(mp_obj_t o_in, mp_print_kind_t kind) {
+ mp_obj_print_helper(printf_wrapper, NULL, o_in, kind);
}
bool mp_obj_is_callable(mp_obj_t o_in) {
diff --git a/py/obj.h b/py/obj.h
index c2182863a1..99d430f490 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -85,7 +85,11 @@ typedef mp_obj_t (*mp_fun_t)(void);
typedef mp_obj_t (*mp_fun_var_t)(int n, const mp_obj_t *);
typedef mp_obj_t (*mp_fun_kw_t)(mp_obj_t, struct _mp_map_t*);
-typedef void (*mp_print_fun_t)(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o);
+typedef enum {
+ PRINT_STR, PRINT_REPR
+} mp_print_kind_t;
+
+typedef void (*mp_print_fun_t)(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o, mp_print_kind_t kind);
typedef mp_obj_t (*mp_make_new_fun_t)(mp_obj_t type_in, int n_args, const mp_obj_t *args); // args are in reverse order in the array
typedef mp_obj_t (*mp_call_n_fun_t)(mp_obj_t fun, int n_args, const mp_obj_t *args); // args are in reverse order in the array
typedef mp_obj_t (*mp_call_n_kw_fun_t)(mp_obj_t fun, int n_args, int n_kw, const mp_obj_t *args); // args are in reverse order in the array
@@ -230,8 +234,8 @@ mp_obj_t mp_obj_new_module(qstr module_name);
mp_obj_t mp_obj_get_type(mp_obj_t o_in);
const char *mp_obj_get_type_str(mp_obj_t o_in);
-void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in);
-void mp_obj_print(mp_obj_t o);
+void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind);
+void mp_obj_print(mp_obj_t o, mp_print_kind_t kind);
bool mp_obj_is_callable(mp_obj_t o_in);
machine_int_t mp_obj_hash(mp_obj_t o_in);
diff --git a/py/objbool.c b/py/objbool.c
index da9a678063..66f9e902a6 100644
--- a/py/objbool.c
+++ b/py/objbool.c
@@ -13,7 +13,7 @@ typedef struct _mp_obj_bool_t {
bool value;
} mp_obj_bool_t;
-static void bool_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void bool_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_bool_t *self = self_in;
if (self->value) {
print(env, "True");
diff --git a/py/objcomplex.c b/py/objcomplex.c
index 1036bae420..bd103bbfab 100644
--- a/py/objcomplex.c
+++ b/py/objcomplex.c
@@ -21,7 +21,7 @@ typedef struct _mp_obj_complex_t {
mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag);
-void complex_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+void complex_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_complex_t *o = o_in;
if (o->real == 0) {
print(env, "%.8gj", o->imag);
diff --git a/py/objdict.c b/py/objdict.c
index e164ed74ca..da1b5b9f5b 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -20,7 +20,7 @@ typedef struct _mp_obj_dict_t {
static mp_obj_t mp_obj_new_dict_iterator(mp_obj_dict_t *dict, int cur);
static mp_map_elem_t *dict_it_iternext_elem(mp_obj_t self_in);
-static void dict_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void dict_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_dict_t *self = self_in;
bool first = true;
print(env, "{");
@@ -31,9 +31,9 @@ static void dict_print(void (*print)(void *env, const char *fmt, ...), void *env
print(env, ", ");
}
first = false;
- mp_obj_print_helper(print, env, next->key);
+ mp_obj_print_helper(print, env, next->key, PRINT_REPR);
print(env, ": ");
- mp_obj_print_helper(print, env, next->value);
+ mp_obj_print_helper(print, env, next->value, PRINT_REPR);
}
print(env, "}");
}
@@ -350,7 +350,7 @@ static mp_obj_t dict_view_getiter(mp_obj_t view_in) {
return o;
}
-static void dict_view_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void dict_view_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
assert(MP_OBJ_IS_TYPE(self_in, &dict_view_type));
mp_obj_dict_view_t *self = self_in;
bool first = true;
@@ -363,7 +363,7 @@ static void dict_view_print(void (*print)(void *env, const char *fmt, ...), void
print(env, ", ");
}
first = false;
- mp_obj_print_helper(print, env, next);
+ mp_obj_print_helper(print, env, next, PRINT_REPR);
}
print(env, "])");
}
diff --git a/py/objexcept.c b/py/objexcept.c
index f083e61e52..67e6d63155 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -21,13 +21,25 @@ typedef struct mp_obj_exception_t {
mp_obj_tuple_t args;
} mp_obj_exception_t;
-void exception_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+void exception_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_exception_t *o = o_in;
if (o->msg != 0) {
print(env, "%s: %s", qstr_str(o->id), qstr_str(o->msg));
} else {
- print(env, "%s", qstr_str(o->id));
- tuple_print(print, env, &o->args);
+ // Yes, that's how CPython has it
+ if (kind == PRINT_REPR) {
+ print(env, "%s", qstr_str(o->id));
+ }
+ if (kind == PRINT_STR) {
+ if (o->args.len == 0) {
+ print(env, "");
+ return;
+ } else if (o->args.len == 1) {
+ mp_obj_print_helper(print, env, o->args.items[0], PRINT_STR);
+ return;
+ }
+ }
+ tuple_print(print, env, &o->args, kind);
}
}
diff --git a/py/objfloat.c b/py/objfloat.c
index bb44ac9549..1ac8754e40 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -19,7 +19,7 @@ typedef struct _mp_obj_float_t {
mp_obj_t mp_obj_new_float(mp_float_t value);
-static void float_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+static void float_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_float_t *o = o_in;
print(env, "%.8g", o->value);
}
diff --git a/py/objgenerator.c b/py/objgenerator.c
index 7eeb4ef80b..40f202df3c 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -61,7 +61,7 @@ typedef struct _mp_obj_gen_instance_t {
mp_obj_t state[];
} mp_obj_gen_instance_t;
-void gen_instance_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void gen_instance_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
print(env, "<generator object 'fun-name' at %p>", self_in);
}
diff --git a/py/objint.c b/py/objint.c
index c0bf756f1b..efec60030d 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -39,7 +39,7 @@ const mp_obj_type_t int_type = {
#if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_NONE
// This is called only for non-SMALL_INT
-void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
}
// This is called only for non-SMALL_INT
diff --git a/py/objint.h b/py/objint.h
index 14cf977be0..7d43971ec3 100644
--- a/py/objint.h
+++ b/py/objint.h
@@ -5,5 +5,5 @@ typedef struct _mp_obj_int_t {
#endif
} mp_obj_int_t;
-void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in);
+void int_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind);
mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in);
diff --git a/py/objlist.c b/py/objlist.c
index 100a02f3cf..829677b43b 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -26,14 +26,14 @@ static mp_obj_t list_extend(mp_obj_t self_in, mp_obj_t arg_in);
/******************************************************************************/
/* list */
-static void list_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+static void list_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_list_t *o = o_in;
print(env, "[");
for (int i = 0; i < o->len; i++) {
if (i > 0) {
print(env, ", ");
}
- mp_obj_print_helper(print, env, o->items[i]);
+ mp_obj_print_helper(print, env, o->items[i], PRINT_REPR);
}
print(env, "]");
}
diff --git a/py/objmodule.c b/py/objmodule.c
index ade9369176..50d2bb35ed 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -17,7 +17,7 @@ typedef struct _mp_obj_module_t {
mp_map_t *globals;
} mp_obj_module_t;
-static void module_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void module_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_module_t *self = self_in;
print(env, "<module '%s' from '-unknown-file-'>", qstr_str(self->name));
}
diff --git a/py/objnone.c b/py/objnone.c
index c0efe6c0f5..84d0ba164c 100644
--- a/py/objnone.c
+++ b/py/objnone.c
@@ -10,7 +10,7 @@ typedef struct _mp_obj_none_t {
mp_obj_base_t base;
} mp_obj_none_t;
-void none_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void none_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
print(env, "None");
}
diff --git a/py/objset.c b/py/objset.c
index ba083ada8a..6ea6d62d8f 100644
--- a/py/objset.c
+++ b/py/objset.c
@@ -25,7 +25,7 @@ typedef struct _mp_obj_set_it_t {
static mp_obj_t set_it_iternext(mp_obj_t self_in);
-void set_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void set_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_set_t *self = self_in;
if (self->set.used == 0) {
print(env, "set()");
@@ -39,7 +39,7 @@ void set_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj
print(env, ", ");
}
first = false;
- mp_obj_print_helper(print, env, self->set.table[i]);
+ mp_obj_print_helper(print, env, self->set.table[i], PRINT_REPR);
}
}
print(env, "}");
diff --git a/py/objslice.c b/py/objslice.c
index d95ccef06f..8abcea08d0 100644
--- a/py/objslice.c
+++ b/py/objslice.c
@@ -16,7 +16,7 @@ typedef struct _mp_obj_ellipsis_t {
mp_obj_base_t base;
} mp_obj_ellipsis_t;
-void ellipsis_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void ellipsis_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
print(env, "Ellipsis");
}
@@ -42,7 +42,7 @@ typedef struct _mp_obj_slice_t {
machine_int_t stop;
} mp_obj_slice_t;
-void slice_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+void slice_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_slice_t *o = o_in;
print(env, "slice(" INT_FMT ", " INT_FMT ")", o->start, o->stop);
}
diff --git a/py/objstr.c b/py/objstr.c
index 8b7ab9692f..0621a8df75 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -22,10 +22,14 @@ static mp_obj_t mp_obj_new_str_iterator(mp_obj_str_t *str, int cur);
/******************************************************************************/
/* str */
-void str_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+void str_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_str_t *self = self_in;
- // TODO need to escape chars etc
- print(env, "'%s'", qstr_str(self->qstr));
+ if (kind == PRINT_STR) {
+ print(env, "%s", qstr_str(self->qstr));
+ } else {
+ // TODO need to escape chars etc
+ print(env, "'%s'", qstr_str(self->qstr));
+ }
}
mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
@@ -254,13 +258,6 @@ mp_obj_t str_strip(int n_args, const mp_obj_t *args) {
return mp_obj_new_str(qstr_from_str_take(stripped_str, stripped_len + 1));
}
-void vstr_printf_wrapper(void *env, const char *fmt, ...) {
- va_list args;
- va_start(args, fmt);
- vstr_vprintf(env, fmt, args);
- va_end(args);
-}
-
mp_obj_t str_format(int n_args, const mp_obj_t *args) {
assert(MP_OBJ_IS_TYPE(args[0], &str_type));
mp_obj_str_t *self = args[0];
@@ -277,7 +274,8 @@ mp_obj_t str_format(int n_args, const mp_obj_t *args) {
if (arg_i >= n_args) {
nlr_jump(mp_obj_new_exception_msg(MP_QSTR_IndexError, "tuple index out of range"));
}
- mp_obj_print_helper(vstr_printf_wrapper, vstr, args[arg_i]);
+ // TODO: may be PRINT_REPR depending on formatting code
+ mp_obj_print_helper((void (*)(void*, const char*, ...))vstr_printf, vstr, args[arg_i], PRINT_STR);
arg_i++;
}
} else {
diff --git a/py/objtuple.c b/py/objtuple.c
index 15e74636f8..a64b1fa16c 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -16,14 +16,14 @@ static mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur);
/******************************************************************************/
/* tuple */
-void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
mp_obj_tuple_t *o = o_in;
print(env, "(");
for (int i = 0; i < o->len; i++) {
if (i > 0) {
print(env, ", ");
}
- mp_obj_print_helper(print, env, o->items[i]);
+ mp_obj_print_helper(print, env, o->items[i], PRINT_REPR);
}
if (o->len == 1) {
print(env, ",");
diff --git a/py/objtuple.h b/py/objtuple.h
index 9c672fe3f5..6ff38c10eb 100644
--- a/py/objtuple.h
+++ b/py/objtuple.h
@@ -4,4 +4,4 @@ typedef struct _mp_obj_tuple_t {
mp_obj_t items[];
} mp_obj_tuple_t;
-void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in);
+void tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind);
diff --git a/py/objtype.c b/py/objtype.c
index 011ee43552..5a2f96d6b0 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -66,7 +66,7 @@ static mp_map_elem_t *mp_obj_class_lookup(const mp_obj_type_t *type, qstr attr,
}
}
-static void class_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void class_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
print(env, "<%s object at %p>", mp_obj_get_type_str(self_in), self_in);
}
@@ -148,7 +148,7 @@ static bool class_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) {
// - there is a constant mp_obj_type_t (called mp_const_type) for the 'type' object
// - creating a new class (a new type) creates a new mp_obj_type_t
-static void type_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
+static void type_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_type_t *self = self_in;
print(env, "<class '%s'>", self->name);
}
diff --git a/py/runtime.c b/py/runtime.c
index 18a3269f49..e1e9e31cc7 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -141,6 +141,7 @@ void rt_init(void) {
mp_map_add_qstr(&map_builtins, MP_QSTR_repr, (mp_obj_t)&mp_builtin_repr_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);
next_unique_code_id = 1; // 0 indicates "no code"
unique_codes_alloc = 0;