summaryrefslogtreecommitdiffstatshomepage
path: root/py/objstr.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-05-25 22:34:34 +0100
committerDamien George <damien.p.george@gmail.com>2014-05-25 22:34:34 +0100
commitf600a6a0851bc2023e9322bac807f5d2217e8451 (patch)
tree6bcc71e3650af453838e5e54fbc1cc1c95623c3a /py/objstr.c
parent2617eebf2ff77e58f415162300747eaf1a5ab5d7 (diff)
downloadmicropython-f600a6a0851bc2023e9322bac807f5d2217e8451.tar.gz
micropython-f600a6a0851bc2023e9322bac807f5d2217e8451.zip
py: Slightly improve efficiency of mp_obj_new_str; rename str_new.
Reorder interning logic in mp_obj_new_str, to be more efficient. str_new is globally accessible, so should be prefixed with mp_obj_.
Diffstat (limited to 'py/objstr.c')
-rw-r--r--py/objstr.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/py/objstr.c b/py/objstr.c
index 48d824f07d..83fd002d1e 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -54,7 +54,6 @@ const mp_obj_t mp_const_empty_bytes;
STATIC mp_obj_t mp_obj_new_str_iterator(mp_obj_t str);
STATIC mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str);
-mp_obj_t str_new(const mp_obj_type_t *type, const byte* data, uint len);
STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in);
STATIC NORETURN void arg_type_mixup();
@@ -143,7 +142,7 @@ STATIC mp_obj_t str_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_
}
GET_STR_DATA_LEN(args[0], str_data, str_len);
GET_STR_HASH(args[0], str_hash);
- mp_obj_str_t *o = str_new(&mp_type_str, NULL, str_len);
+ mp_obj_str_t *o = mp_obj_new_str_of_type(&mp_type_str, NULL, str_len);
o->data = str_data;
o->hash = str_hash;
return o;
@@ -171,7 +170,7 @@ STATIC mp_obj_t bytes_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const m
}
GET_STR_DATA_LEN(args[0], str_data, str_len);
GET_STR_HASH(args[0], str_hash);
- mp_obj_str_t *o = str_new(&mp_type_bytes, NULL, str_len);
+ mp_obj_str_t *o = mp_obj_new_str_of_type(&mp_type_bytes, NULL, str_len);
o->data = str_data;
o->hash = str_hash;
return o;
@@ -356,7 +355,7 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
"Only slices with step=1 (aka None) are supported"));
}
- return str_new(type, self_data + slice.start, slice.stop - slice.start);
+ return mp_obj_new_str_of_type(type, self_data + slice.start, slice.stop - slice.start);
}
#endif
uint index_val = mp_get_index(type, self_len, index, false);
@@ -447,7 +446,7 @@ STATIC mp_obj_t str_split(uint n_args, const mp_obj_t *args) {
while (s < top && splits != 0) {
const byte *start = s;
while (s < top && !is_ws(*s)) s++;
- mp_obj_list_append(res, str_new(self_type, start, s - start));
+ mp_obj_list_append(res, mp_obj_new_str_of_type(self_type, start, s - start));
if (s >= top) {
break;
}
@@ -458,7 +457,7 @@ STATIC mp_obj_t str_split(uint n_args, const mp_obj_t *args) {
}
if (s < top) {
- mp_obj_list_append(res, str_new(self_type, s, top - s));
+ mp_obj_list_append(res, mp_obj_new_str_of_type(self_type, s, top - s));
}
} else {
@@ -482,7 +481,7 @@ STATIC mp_obj_t str_split(uint n_args, const mp_obj_t *args) {
}
s++;
}
- mp_obj_list_append(res, str_new(self_type, start, s - start));
+ mp_obj_list_append(res, mp_obj_new_str_of_type(self_type, start, s - start));
if (s >= top) {
break;
}
@@ -537,10 +536,10 @@ STATIC mp_obj_t str_rsplit(uint n_args, const mp_obj_t *args) {
s--;
}
if (s < beg || splits == 0) {
- res->items[idx] = str_new(self_type, beg, last - beg);
+ res->items[idx] = mp_obj_new_str_of_type(self_type, beg, last - beg);
break;
}
- res->items[idx--] = str_new(self_type, s + sep_len, last - s - sep_len);
+ res->items[idx--] = mp_obj_new_str_of_type(self_type, s + sep_len, last - s - sep_len);
last = s;
if (splits > 0) {
splits--;
@@ -692,7 +691,7 @@ STATIC mp_obj_t str_uni_strip(int type, uint n_args, const mp_obj_t *args) {
assert(last_good_char_pos >= first_good_char_pos);
//+1 to accomodate the last character
machine_uint_t stripped_len = last_good_char_pos - first_good_char_pos + 1;
- return str_new(self_type, orig_str + first_good_char_pos, stripped_len);
+ return mp_obj_new_str_of_type(self_type, orig_str + first_good_char_pos, stripped_len);
}
STATIC mp_obj_t str_strip(uint n_args, const mp_obj_t *args) {
@@ -1455,9 +1454,9 @@ STATIC mp_obj_t str_partitioner(mp_obj_t self_in, mp_obj_t arg, machine_int_t di
const byte *position_ptr = find_subbytes(str, str_len, sep, sep_len, direction);
if (position_ptr != NULL) {
machine_uint_t position = position_ptr - str;
- result[0] = str_new(self_type, str, position);
+ result[0] = mp_obj_new_str_of_type(self_type, str, position);
result[1] = arg;
- result[2] = str_new(self_type, str + position + sep_len, str_len - position - sep_len);
+ result[2] = mp_obj_new_str_of_type(self_type, str + position + sep_len, str_len - position - sep_len);
}
return mp_obj_new_tuple(3, result);
@@ -1641,7 +1640,7 @@ mp_obj_t mp_obj_str_builder_end(mp_obj_t o_in) {
return o;
}
-mp_obj_t str_new(const mp_obj_type_t *type, const byte* data, uint len) {
+mp_obj_t mp_obj_new_str_of_type(const mp_obj_type_t *type, const byte* data, uint len) {
mp_obj_str_t *o = m_new_obj(mp_obj_str_t);
o->base.type = type;
o->len = len;
@@ -1656,21 +1655,23 @@ mp_obj_t str_new(const mp_obj_type_t *type, const byte* data, uint len) {
}
mp_obj_t mp_obj_new_str(const char* data, uint len, bool make_qstr_if_not_already) {
- qstr q = qstr_find_strn(data, len);
- if (q != MP_QSTR_NULL) {
- // qstr with this data already exists
- return MP_OBJ_NEW_QSTR(q);
- } else if (make_qstr_if_not_already) {
- // no existing qstr, make a new one
+ if (make_qstr_if_not_already) {
+ // use existing, or make a new qstr
return MP_OBJ_NEW_QSTR(qstr_from_strn(data, len));
} else {
- // no existing qstr, don't make one
- return str_new(&mp_type_str, (const byte*)data, len);
+ qstr q = qstr_find_strn(data, len);
+ if (q != MP_QSTR_NULL) {
+ // qstr with this data already exists
+ return MP_OBJ_NEW_QSTR(q);
+ } else {
+ // no existing qstr, don't make one
+ return mp_obj_new_str_of_type(&mp_type_str, (const byte*)data, len);
+ }
}
}
mp_obj_t mp_obj_new_bytes(const byte* data, uint len) {
- return str_new(&mp_type_bytes, data, len);
+ return mp_obj_new_str_of_type(&mp_type_bytes, data, len);
}
bool mp_obj_str_equal(mp_obj_t s1, mp_obj_t s2) {