aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--string.c8
-rw-r--r--test/ruby/test_string.rb22
3 files changed, 28 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 845eb852b4..a97cf9b774 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Apr 2 10:34:00 2012 eregon <eregontp@gmail.com>
+
+ * string.c (rb_str_start_with, rb_str_end_with): raise an error if
+ an argument is not convertible to a String.
+ [ruby-core:40623][Bug #5536]
+
Mon Apr 2 03:35:25 2012 NARUSE, Yui <naruse@ruby-lang.org>
* lib/webrick/server.rb (WEBrick::GenericServer): close socket only if
diff --git a/string.c b/string.c
index e16b4291d8..079891a04a 100644
--- a/string.c
+++ b/string.c
@@ -7197,8 +7197,8 @@ rb_str_start_with(int argc, VALUE *argv, VALUE str)
int i;
for (i=0; i<argc; i++) {
- VALUE tmp = rb_check_string_type(argv[i]);
- if (NIL_P(tmp)) continue;
+ VALUE tmp = argv[i];
+ StringValue(tmp);
rb_enc_check(str, tmp);
if (RSTRING_LEN(str) < RSTRING_LEN(tmp)) continue;
if (memcmp(RSTRING_PTR(str), RSTRING_PTR(tmp), RSTRING_LEN(tmp)) == 0)
@@ -7222,8 +7222,8 @@ rb_str_end_with(int argc, VALUE *argv, VALUE str)
rb_encoding *enc;
for (i=0; i<argc; i++) {
- VALUE tmp = rb_check_string_type(argv[i]);
- if (NIL_P(tmp)) continue;
+ VALUE tmp = argv[i];
+ StringValue(tmp);
enc = rb_enc_check(str, tmp);
if (RSTRING_LEN(str) < RSTRING_LEN(tmp)) continue;
p = RSTRING_PTR(str);
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 9cc193ce41..47f349cc18 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -659,6 +659,15 @@ class TestString < Test::Unit::TestCase
assert(!S("not").empty?)
end
+ def test_end_with?
+ assert_send([S("hello"), :end_with?, S("llo")])
+ assert_not_send([S("hello"), :end_with?, S("ll")])
+ assert_send([S("hello"), :end_with?, S("el"), S("lo")])
+
+ bug5536 = '[ruby-core:40623]'
+ assert_raise(TypeError, bug5536) {S("str").end_with? :not_convertible_to_string}
+ end
+
def test_eql?
a = S("hello")
assert(a.eql?(S("hello")))
@@ -1207,6 +1216,15 @@ class TestString < Test::Unit::TestCase
assert_nil(a.squeeze!)
end
+ def test_start_with?
+ assert_send([S("hello"), :start_with?, S("hel")])
+ assert_not_send([S("hello"), :start_with?, S("el")])
+ assert_send([S("hello"), :start_with?, S("el"), S("he")])
+
+ bug5536 = '[ruby-core:40623]'
+ assert_raise(TypeError, bug5536) {S("str").start_with? :not_convertible_to_string}
+ end
+
def test_strip
assert_equal(S("x"), S(" x ").strip)
assert_equal(S("x"), S(" \n\r\t x \t\r\n\n ").strip)
@@ -1774,10 +1792,6 @@ class TestString < Test::Unit::TestCase
assert_nil(l.slice!(/\A.*\n/), "[ruby-dev:31665]")
end
- def test_end_with?
- assert("abc".end_with?("c"))
- end
-
def test_times2
s1 = ''
100.times {|n|