summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-13 19:20:46 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-15 02:15:47 +0200
commit36c4499d36a36ab3e1a68545e613bce61fb15f3c (patch)
tree57d5184880bd55d8355864b0ec2fe834e11635c0
parent76d982ef343dcadd35355aed9c568984c850fb7b (diff)
Implement str() and repr() builtin functions.
-rw-r--r--py/builtin.c16
-rw-r--r--py/builtin.h2
-rw-r--r--py/misc.h2
-rw-r--r--py/mpqstrraw.h2
-rw-r--r--py/runtime.c2
5 files changed, 24 insertions, 0 deletions
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;