Skip to content

Commit 4bca3ad

Browse files
committed
Fix: do not create substrings for 'str.find/rfind'.
1 parent cb7b3fd commit 4bca3ad

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
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: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -600,21 +600,23 @@ protected int findWithBounds(String self, String str, int start, int end) {
600600
public abstract static class RFindNode extends FindBaseNode {
601601

602602
@Override
603-
@TruffleBoundary
603+
@TruffleBoundary(transferToInterpreterOnException = false)
604604
protected int find(String self, String findStr) {
605605
return self.lastIndexOf(findStr);
606606
}
607607

608608
@Override
609-
@TruffleBoundary
609+
@TruffleBoundary(transferToInterpreterOnException = false)
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
}
@@ -625,21 +627,23 @@ protected int findWithBounds(String self, String str, int start, int end) {
625627
public abstract static class FindNode extends FindBaseNode {
626628

627629
@Override
628-
@TruffleBoundary
630+
@TruffleBoundary(transferToInterpreterOnException = false)
629631
protected int find(String self, String findStr) {
630632
return self.indexOf(findStr);
631633
}
632634

633635
@Override
634-
@TruffleBoundary
636+
@TruffleBoundary(transferToInterpreterOnException = false)
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)