Skip to content

Commit 154eedc

Browse files
committed
Use Bind to avoid getting the rope too many times
1 parent bdeb423 commit 154eedc

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/main/java/org/truffleruby/core/string/StringNodes.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import java.io.UnsupportedEncodingException;
7676
import java.nio.charset.StandardCharsets;
7777

78+
import com.oracle.truffle.api.dsl.Bind;
7879
import org.jcodings.Config;
7980
import org.jcodings.Encoding;
8081
import org.jcodings.exception.EncodingException;
@@ -4677,24 +4678,25 @@ protected Object stringRindexEmptyPattern(Object string, Object pattern, int byt
46774678
}
46784679

46794680
@Specialization(guards = {
4680-
"isSingleByteString(libPattern.getRope(pattern))",
4681-
"!isBrokenCodeRange(libPattern.getRope(pattern), codeRangeNode)",
4682-
"canMemcmp(libString.getRope(string), libPattern.getRope(pattern), singleByteNode)" })
4681+
"isSingleByteString(patternRope)",
4682+
"!isBrokenCodeRange(patternRope, codeRangeNode)",
4683+
"canMemcmp(libString.getRope(string), patternRope, singleByteNode)" })
46834684
protected Object stringRindexSingleBytePattern(Object string, Object pattern, int byteOffset,
4685+
@CachedLibrary(limit = "2") RubyStringLibrary libPattern,
4686+
@Bind("libPattern.getRope(pattern)") Rope patternRope,
46844687
@Cached RopeNodes.BytesNode bytesNode,
46854688
@Cached BranchProfile startTooLargeProfile,
46864689
@Cached BranchProfile matchFoundProfile,
46874690
@Cached BranchProfile noMatchProfile,
4688-
@CachedLibrary(limit = "2") RubyStringLibrary libString,
4689-
@CachedLibrary(limit = "2") RubyStringLibrary libPattern) {
4691+
@CachedLibrary(limit = "2") RubyStringLibrary libString) {
46904692
assert byteOffset >= 0;
46914693

46924694
checkEncoding(string, pattern);
46934695

46944696
final Rope sourceRope = libString.getRope(string);
46954697
final int end = sourceRope.byteLength();
46964698
final byte[] sourceBytes = bytesNode.execute(sourceRope);
4697-
final byte searchByte = bytesNode.execute(libPattern.getRope(pattern))[0];
4699+
final byte searchByte = bytesNode.execute(patternRope)[0];
46984700
int normalizedStart = byteOffset;
46994701

47004702
if (normalizedStart >= end) {
@@ -4714,26 +4716,27 @@ protected Object stringRindexSingleBytePattern(Object string, Object pattern, in
47144716
}
47154717

47164718
@Specialization(guards = {
4717-
"!isEmpty(libPattern.getRope(pattern))",
4718-
"!isSingleByteString(libPattern.getRope(pattern))",
4719-
"!isBrokenCodeRange(libPattern.getRope(pattern), codeRangeNode)",
4720-
"canMemcmp(libString.getRope(string), libPattern.getRope(pattern), singleByteNode)" })
4719+
"!isEmpty(patternRope)",
4720+
"!isSingleByteString(patternRope)",
4721+
"!isBrokenCodeRange(patternRope, codeRangeNode)",
4722+
"canMemcmp(libString.getRope(string), patternRope, singleByteNode)" })
47214723
protected Object stringRindexMultiBytePattern(Object string, Object pattern, int byteOffset,
4724+
@CachedLibrary(limit = "2") RubyStringLibrary libPattern,
4725+
@Bind("libPattern.getRope(pattern)") Rope patternRope,
47224726
@Cached RopeNodes.BytesNode bytesNode,
47234727
@Cached BranchProfile startOutOfBoundsProfile,
47244728
@Cached BranchProfile startTooCloseToEndProfile,
47254729
@Cached BranchProfile matchFoundProfile,
47264730
@Cached BranchProfile noMatchProfile,
4727-
@CachedLibrary(limit = "2") RubyStringLibrary libString,
4728-
@CachedLibrary(limit = "2") RubyStringLibrary libPattern) {
4731+
@CachedLibrary(limit = "2") RubyStringLibrary libString) {
47294732
assert byteOffset >= 0;
47304733

47314734
checkEncoding(string, pattern);
47324735

47334736
final Rope sourceRope = libString.getRope(string);
47344737
final int end = sourceRope.byteLength();
47354738
final byte[] sourceBytes = bytesNode.execute(sourceRope);
4736-
final Rope searchRope = libPattern.getRope(pattern);
4739+
final Rope searchRope = patternRope;
47374740
final int matchSize = searchRope.byteLength();
47384741
final byte[] searchBytes = bytesNode.execute(searchRope);
47394742
int normalizedStart = byteOffset;
@@ -4769,22 +4772,22 @@ protected Object stringRindexBrokenPattern(Object string, Object pattern, int by
47694772
}
47704773

47714774
@Specialization(guards = {
4772-
"!isBrokenCodeRange(libPattern.getRope(pattern), codeRangeNode)",
4773-
"!canMemcmp(libString.getRope(string), libPattern.getRope(pattern), singleByteNode)" })
4775+
"!isBrokenCodeRange(patternRope, codeRangeNode)",
4776+
"!canMemcmp(libString.getRope(string), patternRope, singleByteNode)" })
47744777
protected Object stringRindex(Object string, Object pattern, int byteOffset,
4778+
@CachedLibrary(limit = "2") RubyStringLibrary libPattern,
4779+
@Bind("libPattern.getRope(pattern)") Rope patternRope,
47754780
@Cached RopeNodes.BytesNode stringBytes,
47764781
@Cached RopeNodes.BytesNode patternBytes,
47774782
@Cached RopeNodes.GetByteNode patternGetByteNode,
47784783
@Cached RopeNodes.GetByteNode stringGetByteNode,
4779-
@CachedLibrary(limit = "2") RubyStringLibrary libString,
4780-
@CachedLibrary(limit = "2") RubyStringLibrary libPattern) {
4784+
@CachedLibrary(limit = "2") RubyStringLibrary libString) {
47814785
// Taken from Rubinius's String::rindex.
47824786
assert byteOffset >= 0;
47834787

47844788
int pos = byteOffset;
47854789

47864790
final Rope stringRope = libString.getRope(string);
4787-
final Rope patternRope = libPattern.getRope(pattern);
47884791
final int total = stringRope.byteLength();
47894792
final int matchSize = patternRope.byteLength();
47904793

0 commit comments

Comments
 (0)