summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/modbuiltins.c2
-rw-r--r--py/obj.h5
-rw-r--r--py/objstr.c7
-rw-r--r--py/parsenum.c2
-rw-r--r--py/persistentcode.c2
5 files changed, 15 insertions, 3 deletions
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index 2459edda1..f74db95cf 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -467,7 +467,7 @@ STATIC mp_obj_t mp_builtin_repr(mp_obj_t o_in) {
mp_print_t print;
vstr_init_print(&vstr, 16, &print);
mp_obj_print_helper(&print, o_in, PRINT_REPR);
- return mp_obj_new_str_from_vstr(&vstr);
+ return mp_obj_new_str_from_utf8_vstr(&vstr);
}
MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_repr_obj, mp_builtin_repr);
diff --git a/py/obj.h b/py/obj.h
index d171e0fe6..0b0a9692e 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -792,6 +792,11 @@ mp_obj_t mp_obj_new_int_from_ull(unsigned long long val); // this must return a
mp_obj_t mp_obj_new_str(const char *data, size_t len);
mp_obj_t mp_obj_new_str_via_qstr(const char *data, size_t len);
mp_obj_t mp_obj_new_str_from_vstr(vstr_t *vstr);
+#if MICROPY_PY_BUILTINS_STR_UNICODE && MICROPY_PY_BUILTINS_STR_UNICODE_CHECK
+mp_obj_t mp_obj_new_str_from_utf8_vstr(vstr_t *vstr); // only use when vstr is already known to be utf-8 encoded
+#else
+#define mp_obj_new_str_from_utf8_vstr mp_obj_new_str_from_vstr
+#endif
mp_obj_t mp_obj_new_bytes_from_vstr(vstr_t *vstr);
mp_obj_t mp_obj_new_bytes(const byte *data, size_t len);
mp_obj_t mp_obj_new_bytearray(size_t n, const void *items);
diff --git a/py/objstr.c b/py/objstr.c
index ab1229ad6..5a6223751 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -2256,6 +2256,13 @@ mp_obj_t mp_obj_new_str_from_vstr(vstr_t *vstr) {
return mp_obj_new_str_type_from_vstr(&mp_type_str, vstr);
}
+#if MICROPY_PY_BUILTINS_STR_UNICODE && MICROPY_PY_BUILTINS_STR_UNICODE_CHECK
+mp_obj_t mp_obj_new_str_from_utf8_vstr(vstr_t *vstr) {
+ // bypasses utf8_check.
+ return mp_obj_new_str_type_from_vstr(&mp_type_str, vstr);
+}
+#endif // MICROPY_PY_BUILTINS_STR_UNICODE && MICROPY_PY_BUILTINS_STR_UNICODE_CHECK
+
mp_obj_t mp_obj_new_bytes_from_vstr(vstr_t *vstr) {
return mp_obj_new_str_type_from_vstr(&mp_type_bytes, vstr);
}
diff --git a/py/parsenum.c b/py/parsenum.c
index 79765f84f..d59715fdc 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -160,7 +160,7 @@ value_error:
mp_printf(&print, "invalid syntax for integer with base %d: ", base);
mp_str_print_quoted(&print, str_val_start, top - str_val_start, true);
mp_obj_t exc = mp_obj_new_exception_arg1(&mp_type_ValueError,
- mp_obj_new_str_from_vstr(&vstr));
+ mp_obj_new_str_from_utf8_vstr(&vstr));
raise_exc(exc, lex);
#endif
}
diff --git a/py/persistentcode.c b/py/persistentcode.c
index 995dedb45..82ef0c499 100644
--- a/py/persistentcode.c
+++ b/py/persistentcode.c
@@ -203,7 +203,7 @@ STATIC mp_obj_t load_obj(mp_reader_t *reader) {
if (obj_type == MP_PERSISTENT_OBJ_STR || obj_type == MP_PERSISTENT_OBJ_BYTES) {
read_byte(reader); // skip null terminator
if (obj_type == MP_PERSISTENT_OBJ_STR) {
- return mp_obj_new_str_from_vstr(&vstr);
+ return mp_obj_new_str_from_utf8_vstr(&vstr);
} else {
return mp_obj_new_bytes_from_vstr(&vstr);
}