summaryrefslogtreecommitdiff
path: root/py/objstr.c
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2022-08-22 17:08:05 +1000
committerDamien George <damien@micropython.org>2022-08-26 16:43:55 +1000
commit8a0ee5a5c04e83f04d1c62029ac5ba7c74856507 (patch)
treeeaa10ed5c00b4c21eea7def9fd0fbf5001a97dd4 /py/objstr.c
parent09879f99ca3a6c0e48353eb2aaa1c71ed237f126 (diff)
py/objstr: Split mp_obj_str_from_vstr into bytes/str versions.
Previously the desired output type was specified. Now make the type part of the function name. Because this function is used in a few places this saves code size due to smaller call-site. This makes `mp_obj_new_str_type_from_vstr` a private function of objstr.c (which is almost the only place where the output type isn't a compile-time constant). This saves ~140 bytes on PYBV11. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
Diffstat (limited to 'py/objstr.c')
-rw-r--r--py/objstr.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/py/objstr.c b/py/objstr.c
index 45dbb9b3e..69745a2f5 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) {