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:
parent
c5c095690f
commit
37379a2974
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# MicroPython doesn't support tuple argument
|
||||||
|
|
||||||
|
try:
|
||||||
|
"foobar".endswith(("bar", "sth"))
|
||||||
|
except TypeError:
|
||||||
|
print("TypeError")
|
|
@ -0,0 +1 @@
|
||||||
|
TypeError
|
|
@ -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")
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# MicroPython doesn't support tuple argument
|
||||||
|
|
||||||
|
try:
|
||||||
|
"foobar".startswith(("foo", "sth"))
|
||||||
|
except TypeError:
|
||||||
|
print("TypeError")
|
|
@ -0,0 +1 @@
|
||||||
|
TypeError
|
Loading…
Reference in New Issue