summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/modbuiltins.c4
-rw-r--r--py/modstruct.c2
-rw-r--r--py/obj.h3
-rw-r--r--py/objint.c2
-rw-r--r--py/objstr.c40
-rw-r--r--py/parsenum.c2
-rw-r--r--py/persistentcode.c6
-rw-r--r--py/stream.c22
8 files changed, 53 insertions, 28 deletions
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index f3caccbc83..2459edda13 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -250,7 +250,7 @@ STATIC mp_obj_t mp_builtin_input(size_t n_args, const mp_obj_t *args) {
if (line.len == 0 && ret == CHAR_CTRL_D) {
mp_raise_type(&mp_type_EOFError);
}
- return mp_obj_new_str_from_vstr(&mp_type_str, &line);
+ return mp_obj_new_str_from_vstr(&line);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_input_obj, 0, 1, mp_builtin_input);
@@ -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(&mp_type_str, &vstr);
+ return mp_obj_new_str_from_vstr(&vstr);
}
MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_repr_obj, mp_builtin_repr);
diff --git a/py/modstruct.c b/py/modstruct.c
index 69c7279e37..ec86d4b9c2 100644
--- a/py/modstruct.c
+++ b/py/modstruct.c
@@ -220,7 +220,7 @@ STATIC mp_obj_t struct_pack(size_t n_args, const mp_obj_t *args) {
byte *p = (byte *)vstr.buf;
memset(p, 0, size);
struct_pack_into_internal(args[0], p, n_args - 1, &args[1]);
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+ return mp_obj_new_bytes_from_vstr(&vstr);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(struct_pack_obj, 1, MP_OBJ_FUN_ARGS_MAX, struct_pack);
diff --git a/py/obj.h b/py/obj.h
index 645fae79f5..d171e0fe62 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -791,7 +791,8 @@ mp_obj_t mp_obj_new_int_from_ll(long long val); // this must return a multi-prec
mp_obj_t mp_obj_new_int_from_ull(unsigned long long val); // this must return a multi-precision integer object (or raise an overflow exception)
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(const mp_obj_type_t *type, vstr_t *vstr);
+mp_obj_t mp_obj_new_str_from_vstr(vstr_t *vstr);
+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);
mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items);
diff --git a/py/objint.c b/py/objint.c
index 740e7ea948..645b269966 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -446,7 +446,7 @@ STATIC mp_obj_t int_to_bytes(size_t n_args, const mp_obj_t *args) {
mp_binary_set_int(l, big_endian, data + (big_endian ? (len - l) : 0), val);
}
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+ return mp_obj_new_bytes_from_vstr(&vstr);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(int_to_bytes_obj, 3, 4, int_to_bytes);
diff --git a/py/objstr.c b/py/objstr.c
index 45dbb9b3eb..69745a2f58 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -41,6 +41,8 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_
STATIC mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str, mp_obj_iter_buf_t *iter_buf);
STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in);
+STATIC mp_obj_t mp_obj_new_str_type_from_vstr(const mp_obj_type_t *type, vstr_t *vstr);
+
STATIC void str_check_arg_type(const mp_obj_type_t *self_type, const mp_obj_t arg) {
// String operations generally need the args type to match the object they're called on,
// e.g. str.find(str), byte.startswith(byte)
@@ -170,7 +172,7 @@ mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
mp_print_t print;
vstr_init_print(&vstr, 16, &print);
mp_obj_print_helper(&print, args[0], PRINT_STR);
- return mp_obj_new_str_from_vstr(type, &vstr);
+ return mp_obj_new_str_type_from_vstr(type, &vstr);
}
default: // 2 or 3 args
@@ -256,7 +258,7 @@ STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, size
vstr_t vstr;
vstr_init_len(&vstr, len);
memset(vstr.buf, 0, len);
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+ return mp_obj_new_bytes_from_vstr(&vstr);
}
// check if argument has the buffer protocol
@@ -288,7 +290,7 @@ STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, size
vstr_add_byte(&vstr, val);
}
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+ return mp_obj_new_bytes_from_vstr(&vstr);
wrong_args:
mp_raise_TypeError(MP_ERROR_TEXT("wrong number of arguments"));
@@ -363,7 +365,7 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i
vstr_t vstr;
vstr_init_len(&vstr, lhs_len * n);
mp_seq_multiply(lhs_data, sizeof(*lhs_data), lhs_len, n, vstr.buf);
- return mp_obj_new_str_from_vstr(lhs_type, &vstr);
+ return mp_obj_new_str_type_from_vstr(lhs_type, &vstr);
}
// From now on all operations allow:
@@ -414,7 +416,7 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i
vstr_init_len(&vstr, lhs_len + rhs_len);
memcpy(vstr.buf, lhs_data, lhs_len);
memcpy(vstr.buf + lhs_len, rhs_data, rhs_len);
- return mp_obj_new_str_from_vstr(lhs_type, &vstr);
+ return mp_obj_new_str_type_from_vstr(lhs_type, &vstr);
}
case MP_BINARY_OP_CONTAINS:
@@ -528,7 +530,7 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
}
// return joined string
- return mp_obj_new_str_from_vstr(ret_type, &vstr);
+ return mp_obj_new_str_type_from_vstr(ret_type, &vstr);
}
MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join);
@@ -918,7 +920,7 @@ STATIC mp_obj_t str_center(mp_obj_t str_in, mp_obj_t width_in) {
memset(vstr.buf, ' ', width);
int left = (width - str_len) / 2;
memcpy(vstr.buf + left, str, str_len);
- return mp_obj_new_str_from_vstr(mp_obj_get_type(str_in), &vstr);
+ return mp_obj_new_str_type_from_vstr(mp_obj_get_type(str_in), &vstr);
}
MP_DEFINE_CONST_FUN_OBJ_2(str_center_obj, str_center);
#endif
@@ -1144,7 +1146,7 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
mp_print_t arg_print;
vstr_init_print(&arg_vstr, 16, &arg_print);
mp_obj_print_helper(&arg_print, arg, print_kind);
- arg = mp_obj_new_str_from_vstr(&mp_type_str, &arg_vstr);
+ arg = mp_obj_new_str_type_from_vstr(&mp_type_str, &arg_vstr);
}
char fill = '\0';
@@ -1429,7 +1431,7 @@ mp_obj_t mp_obj_str_format(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs
GET_STR_DATA_LEN(args[0], str, len);
int arg_i = 0;
vstr_t vstr = mp_obj_str_format_helper((const char *)str, (const char *)str + len, &arg_i, n_args, args, kwargs);
- return mp_obj_new_str_from_vstr(mp_obj_get_type(args[0]), &vstr);
+ return mp_obj_new_str_type_from_vstr(mp_obj_get_type(args[0]), &vstr);
}
MP_DEFINE_CONST_FUN_OBJ_KW(str_format_obj, 1, mp_obj_str_format);
@@ -1634,7 +1636,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_
mp_raise_TypeError(MP_ERROR_TEXT("format string didn't convert all arguments"));
}
- return mp_obj_new_str_from_vstr(is_bytes ? &mp_type_bytes : &mp_type_str, &vstr);
+ return mp_obj_new_str_type_from_vstr(is_bytes ? &mp_type_bytes : &mp_type_str, &vstr);
}
#endif
@@ -1737,7 +1739,7 @@ STATIC mp_obj_t str_replace(size_t n_args, const mp_obj_t *args) {
}
}
- return mp_obj_new_str_from_vstr(self_type, &vstr);
+ return mp_obj_new_str_type_from_vstr(self_type, &vstr);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_replace_obj, 3, 4, str_replace);
@@ -1849,7 +1851,7 @@ STATIC mp_obj_t str_caseconv(unichar (*op)(unichar), mp_obj_t self_in) {
for (size_t i = 0; i < self_len; i++) {
*data++ = op(*self_data++);
}
- return mp_obj_new_str_from_vstr(mp_obj_get_type(self_in), &vstr);
+ return mp_obj_new_str_type_from_vstr(mp_obj_get_type(self_in), &vstr);
}
STATIC mp_obj_t str_lower(mp_obj_t self_in) {
@@ -1988,7 +1990,7 @@ mp_obj_t mp_obj_bytes_hex(size_t n_args, const mp_obj_t *args, const mp_obj_type
*out++ = *sep;
}
}
- return mp_obj_new_str_from_vstr(type, &vstr);
+ return mp_obj_new_str_type_from_vstr(type, &vstr);
}
mp_obj_t mp_obj_bytes_fromhex(mp_obj_t type_in, mp_obj_t data) {
@@ -2016,7 +2018,7 @@ mp_obj_t mp_obj_bytes_fromhex(mp_obj_t type_in, mp_obj_t data) {
hex_byte = 0;
}
}
- return mp_obj_new_str_from_vstr(MP_OBJ_TO_PTR(type_in), &vstr);
+ return mp_obj_new_str_type_from_vstr(MP_OBJ_TO_PTR(type_in), &vstr);
}
STATIC mp_obj_t bytes_hex_as_str(size_t n_args, const mp_obj_t *args) {
@@ -2213,7 +2215,7 @@ mp_obj_t mp_obj_new_str_via_qstr(const char *data, size_t len) {
// Create a str/bytes object from the given vstr. The vstr buffer is resized to
// the exact length required and then reused for the str/bytes object. The vstr
// is cleared and can safely be passed to vstr_free if it was heap allocated.
-mp_obj_t mp_obj_new_str_from_vstr(const mp_obj_type_t *type, vstr_t *vstr) {
+STATIC mp_obj_t mp_obj_new_str_type_from_vstr(const mp_obj_type_t *type, vstr_t *vstr) {
// if not a bytes object, look if a qstr with this data already exists
if (type == &mp_type_str) {
qstr q = qstr_find_strn(vstr->buf, vstr->len);
@@ -2245,6 +2247,14 @@ mp_obj_t mp_obj_new_str_from_vstr(const mp_obj_type_t *type, vstr_t *vstr) {
return MP_OBJ_FROM_PTR(o);
}
+mp_obj_t mp_obj_new_str_from_vstr(vstr_t *vstr) {
+ return mp_obj_new_str_type_from_vstr(&mp_type_str, vstr);
+}
+
+mp_obj_t mp_obj_new_bytes_from_vstr(vstr_t *vstr) {
+ return mp_obj_new_str_type_from_vstr(&mp_type_bytes, vstr);
+}
+
mp_obj_t mp_obj_new_str(const char *data, size_t len) {
qstr q = qstr_find_strn(data, len);
if (q != MP_QSTRnull) {
diff --git a/py/parsenum.c b/py/parsenum.c
index 19cc719201..79765f84f6 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(&mp_type_str, &vstr));
+ mp_obj_new_str_from_vstr(&vstr));
raise_exc(exc, lex);
#endif
}
diff --git a/py/persistentcode.c b/py/persistentcode.c
index a8e7429550..995dedb456 100644
--- a/py/persistentcode.c
+++ b/py/persistentcode.c
@@ -202,7 +202,11 @@ STATIC mp_obj_t load_obj(mp_reader_t *reader) {
read_bytes(reader, (byte *)vstr.buf, len);
if (obj_type == MP_PERSISTENT_OBJ_STR || obj_type == MP_PERSISTENT_OBJ_BYTES) {
read_byte(reader); // skip null terminator
- return mp_obj_new_str_from_vstr(obj_type == MP_PERSISTENT_OBJ_STR ? &mp_type_str : &mp_type_bytes, &vstr);
+ if (obj_type == MP_PERSISTENT_OBJ_STR) {
+ return mp_obj_new_str_from_vstr(&vstr);
+ } else {
+ return mp_obj_new_bytes_from_vstr(&vstr);
+ }
} else if (obj_type == MP_PERSISTENT_OBJ_INT) {
return mp_parse_num_integer(vstr.buf, vstr.len, 10, NULL);
} else {
diff --git a/py/stream.c b/py/stream.c
index dce64a44db..87bed38f67 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -40,8 +40,6 @@
STATIC mp_obj_t stream_readall(mp_obj_t self_in);
-#define STREAM_CONTENT_TYPE(stream) (((stream)->is_text) ? &mp_type_str : &mp_type_bytes)
-
// Returns error condition in *errcode, if non-zero, return value is number of bytes written
// before error condition occurred. If *errcode == 0, returns total bytes written (which will
// be equal to input size).
@@ -190,7 +188,7 @@ STATIC mp_obj_t stream_read_generic(size_t n_args, const mp_obj_t *args, byte fl
}
}
- return mp_obj_new_str_from_vstr(&mp_type_str, &vstr);
+ return mp_obj_new_str_from_vstr(&vstr);
}
#endif
@@ -211,7 +209,11 @@ STATIC mp_obj_t stream_read_generic(size_t n_args, const mp_obj_t *args, byte fl
mp_raise_OSError(error);
} else {
vstr.len = out_sz;
- return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
+ if (stream_p->is_text) {
+ return mp_obj_new_str_from_vstr(&vstr);
+ } else {
+ return mp_obj_new_bytes_from_vstr(&vstr);
+ }
}
}
@@ -337,7 +339,11 @@ STATIC mp_obj_t stream_readall(mp_obj_t self_in) {
}
vstr.len = total_size;
- return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
+ if (stream_p->is_text) {
+ return mp_obj_new_str_from_vstr(&vstr);
+ } else {
+ return mp_obj_new_bytes_from_vstr(&vstr);
+ }
}
// Unbuffered, inefficient implementation of readline() for raw I/O files.
@@ -390,7 +396,11 @@ STATIC mp_obj_t stream_unbuffered_readline(size_t n_args, const mp_obj_t *args)
}
}
- return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
+ if (stream_p->is_text) {
+ return mp_obj_new_str_from_vstr(&vstr);
+ } else {
+ return mp_obj_new_bytes_from_vstr(&vstr);
+ }
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_unbuffered_readline_obj, 1, 2, stream_unbuffered_readline);