py/objstr: startswith, endswith: Check arg to be a string.

Otherwise, it will silently get incorrect result on other values types,
including CPython tuple form like "foo.png".endswith(("png", "jpg"))
(which MicroPython doesn't support for unbloatedness).
This commit is contained in:
Paul Sokolovsky 2017-08-29 00:06:21 +03:00
parent c5c095690f
commit 37379a2974
7 changed files with 28 additions and 2 deletions

View File

@ -726,7 +726,8 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rindex_obj, 2, 4, str_rindex);
STATIC mp_obj_t str_startswith(size_t n_args, const mp_obj_t *args) { STATIC mp_obj_t str_startswith(size_t n_args, const mp_obj_t *args) {
const mp_obj_type_t *self_type = mp_obj_get_type(args[0]); const mp_obj_type_t *self_type = mp_obj_get_type(args[0]);
GET_STR_DATA_LEN(args[0], str, str_len); GET_STR_DATA_LEN(args[0], str, str_len);
GET_STR_DATA_LEN(args[1], prefix, prefix_len); size_t prefix_len;
const char *prefix = mp_obj_str_get_data(args[1], &prefix_len);
const byte *start = str; const byte *start = str;
if (n_args > 2) { if (n_args > 2) {
start = str_index_to_ptr(self_type, str, str_len, args[2], true); start = str_index_to_ptr(self_type, str, str_len, args[2], true);
@ -740,7 +741,8 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 3, str_startswith);
STATIC mp_obj_t str_endswith(size_t n_args, const mp_obj_t *args) { STATIC mp_obj_t str_endswith(size_t n_args, const mp_obj_t *args) {
GET_STR_DATA_LEN(args[0], str, str_len); GET_STR_DATA_LEN(args[0], str, str_len);
GET_STR_DATA_LEN(args[1], suffix, suffix_len); size_t suffix_len;
const char *suffix = mp_obj_str_get_data(args[1], &suffix_len);
if (n_args > 2) { if (n_args > 2) {
mp_raise_NotImplementedError("start/end indices"); mp_raise_NotImplementedError("start/end indices");
} }

View File

@ -10,3 +10,8 @@ print("foobar".endswith("foobarbaz"))
#print("1foo".startswith("1foo", 1)) #print("1foo".startswith("1foo", 1))
#print("1fo".startswith("foo", 1)) #print("1fo".startswith("foo", 1))
#print("1fo".startswith("foo", 10)) #print("1fo".startswith("foo", 10))
try:
"foobar".endswith(1)
except TypeError:
print("TypeError")

View File

@ -0,0 +1,6 @@
# MicroPython doesn't support tuple argument
try:
"foobar".endswith(("bar", "sth"))
except TypeError:
print("TypeError")

View File

@ -0,0 +1 @@
TypeError

View File

@ -9,3 +9,8 @@ print("1foo".startswith("foo", 1))
print("1foo".startswith("1foo", 1)) print("1foo".startswith("1foo", 1))
print("1fo".startswith("foo", 1)) print("1fo".startswith("foo", 1))
print("1fo".startswith("foo", 10)) print("1fo".startswith("foo", 10))
try:
"foobar".startswith(1)
except TypeError:
print("TypeError")

View File

@ -0,0 +1,6 @@
# MicroPython doesn't support tuple argument
try:
"foobar".startswith(("foo", "sth"))
except TypeError:
print("TypeError")

View File

@ -0,0 +1 @@
TypeError