Skip to content

Commit 68009c2

Browse files
committed
[GR-11936] Do not create substrings for 'str.find/rfind'.
PullRequest: graalpython/209
2 parents 2518ca1 + ed65c77 commit 68009c2

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_string.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ def test_rfind():
2929
assert "test string test".rfind("string") == 5
3030
assert "test string".rfind("test", 5) == -1
3131
assert "test string test".rfind("test", None, 12) == 0
32+
assert "test string test".rfind("test", 4) == 12
33+
assert "test string test".rfind("test", 4, 12) == -1
34+
assert "test string test".rfind("test", 4, 14) == -1
35+
assert "test string test".rfind("test", None, 14) == 0
3236

3337

3438
def test_format():

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -609,12 +609,14 @@ protected int find(String self, String findStr) {
609609
@TruffleBoundary
610610
protected int findWithBounds(String self, String str, int start, int end) {
611611
if (start != -1 && end != -1) {
612-
return self.substring(start, end).lastIndexOf(str);
612+
int idx = self.lastIndexOf(str, end - str.length() - 1);
613+
return idx >= start ? idx : -1;
613614
} else if (start != -1) {
614-
return self.substring(start).lastIndexOf(str);
615+
int idx = self.lastIndexOf(str);
616+
return idx >= start ? idx : -1;
615617
} else {
616618
assert end != -1;
617-
return self.substring(0, end).lastIndexOf(str);
619+
return self.lastIndexOf(str, end - str.length() - 1);
618620
}
619621
}
620622
}
@@ -634,12 +636,14 @@ protected int find(String self, String findStr) {
634636
@TruffleBoundary
635637
protected int findWithBounds(String self, String str, int start, int end) {
636638
if (start != -1 && end != -1) {
637-
return self.substring(0, end).indexOf(str, start);
639+
int idx = self.indexOf(str, start);
640+
return idx + str.length() <= end ? idx : -1;
638641
} else if (start != -1) {
639642
return self.indexOf(str, start);
640643
} else {
641644
assert end != -1;
642-
return self.substring(0, end).indexOf(str);
645+
int idx = self.indexOf(str);
646+
return idx + str.length() <= end ? idx : -1;
643647
}
644648
}
645649
}

0 commit comments

Comments
 (0)