summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--re.c3
-rw-r--r--test/ruby/test_string.rb7
3 files changed, 16 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ab2f0997d1..7320f95d4b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Nov 22 14:14:36 2012 Akinori MUSHA <knu@iDaemons.org>
+
+ * re.c (rb_memsearch_ss): Apply performance improvement to short
+ byte array search for platforms without memmem(3).
+ [Feature #6311] [ruby-dev:45530]
+
Thu Nov 22 12:52:19 2012 Akinori MUSHA <knu@iDaemons.org>
* test/ruby/test_string.rb (TestString#test_index): Add some
diff --git a/re.c b/re.c
index 97803d4e38..8fa1abc0e6 100644
--- a/re.c
+++ b/re.c
@@ -126,6 +126,9 @@ rb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long n
if (m > SIZEOF_VALUE)
rb_bug("!!too long pattern string!!");
+ if (!(y = memchr(y, *x, n - m + 1)))
+ return -1;
+
/* Prepare hash value */
for (hx = *x++, hy = *y++; x < xe; ++x, ++y) {
hx <<= CHAR_BIT;
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 2e63eff5a7..cf63048750 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -837,6 +837,13 @@ class TestString < Test::Unit::TestCase
assert_equal(0, S("hello").index(S("")))
assert_equal(0, S("hello").index(//))
+ s = S("long") * 1000 << "x"
+ assert_nil(s.index(S("y")))
+ assert_equal(4 * 1000, s.index(S("x")))
+ s << "yx"
+ assert_equal(4 * 1000, s.index(S("x")))
+ assert_equal(4 * 1000, s.index(S("xyx")))
+
o = Object.new
def o.to_str; "bar"; end
assert_equal(3, "foobarbarbaz".index(o))