diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index fb3eac6a..16049a20 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -594,18 +594,20 @@ void init_builtins(VM* _vm) { return VAR(self.count(s)); }); - _vm->bind_method<1>(VM::tp_str, "index", [](VM* vm, ArgsView args) { + _vm->bind(_vm->_t(VM::tp_str), "index(self, value, __start=0)", [](VM* vm, ArgsView args) { const Str& self = _CAST(Str&, args[0]); - const Str& sub = CAST(Str&, args[1]); - int index = self.index(sub); - if(index == -1) vm->ValueError("substring not found"); + const Str& value = CAST(Str&, args[1]); + int start = CAST(int, args[2]); + int index = self.index(value, start); + if(index < 0) vm->ValueError("substring not found"); return VAR(index); }); - _vm->bind_method<1>(VM::tp_str, "find", [](VM* vm, ArgsView args) { + _vm->bind(_vm->_t(VM::tp_str), "find(self, value, __start=0)", [](VM* vm, ArgsView args) { const Str& self = _CAST(Str&, args[0]); - const Str& sub = CAST(Str&, args[1]); - return VAR(self.index(sub)); + const Str& value = CAST(Str&, args[1]); + int start = CAST(int, args[2]); + return VAR(self.index(value, start)); }); _vm->bind_method<1>(VM::tp_str, "startswith", [](VM* vm, ArgsView args) { diff --git a/tests/04_str.py b/tests/04_str.py index 2db6a1e8..fe950742 100644 --- a/tests/04_str.py +++ b/tests/04_str.py @@ -223,3 +223,22 @@ test(0, 100000) test(-100, 100) test(-100000, 100000) test(-2**30, 2**30) + + +a = '123' +assert a.index('2') == 1 +assert a.index('1') == 0 +assert a.index('3') == 2 + +assert a.index('2', 1) == 1 +assert a.index('1', 0) == 0 + +try: + a.index('1', 1) + exit(1) +except ValueError: + pass + +assert a.find('1') == 0 +assert a.find('1', 1) == -1 +