summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorstomar <stomar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-21 19:28:48 +0000
committerstomar <stomar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-21 19:28:48 +0000
commit40bc846bf8a0504777c9f5bc4223faa8888889a6 (patch)
tree1d7cc4f8ab3db30ef86bc73732e228bb522dcc6c /string.c
parent913afdf95c3edf40d49d31e9b153ad8ef3cd17dd (diff)
string.c: fix String#{casecmp,casecmp?} for non-string arguments
* string.c: make String#{casecmp,casecmp?} return nil for non-string arguments instead of raising a TypeError. * test/ruby/test_string.rb: add tests. Reported by Marcus Stollsteimer. Based on a patch by Shingo Morita. [ruby-core:80145] [Bug #13312] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/string.c b/string.c
index 1d357638a5..c0483c9471 100644
--- a/string.c
+++ b/string.c
@@ -3234,16 +3234,21 @@ static VALUE str_casecmp_p(VALUE str1, VALUE str2);
* "aBcDeF".casecmp("abcdefg") #=> -1
* "abcdef".casecmp("ABCDEF") #=> 0
*
- * +nil+ is returned if the two strings have incompatible encodings.
+ * +nil+ is returned if the two strings have incompatible encodings,
+ * or if +other_str+ is not a string.
*
+ * "foo".casecmp(2) #=> nil
* "\u{e4 f6 fc}".encode("ISO-8859-1").casecmp("\u{c4 d6 dc}") #=> nil
*/
static VALUE
rb_str_casecmp(VALUE str1, VALUE str2)
{
- StringValue(str2);
- return str_casecmp(str1, str2);
+ VALUE s = rb_check_string_type(str2);
+ if (NIL_P(s)) {
+ return Qnil;
+ }
+ return str_casecmp(str1, s);
}
static VALUE
@@ -3316,16 +3321,21 @@ str_casecmp(VALUE str1, VALUE str2)
* "abcdef".casecmp?("ABCDEF") #=> true
* "\u{e4 f6 fc}".casecmp?("\u{c4 d6 dc}") #=> true
*
- * +nil+ is returned if the two strings have incompatible encodings.
+ * +nil+ is returned if the two strings have incompatible encodings,
+ * or if +other_str+ is not a string.
*
+ * "foo".casecmp?(2) #=> nil
* "\u{e4 f6 fc}".encode("ISO-8859-1").casecmp?("\u{c4 d6 dc}") #=> nil
*/
static VALUE
rb_str_casecmp_p(VALUE str1, VALUE str2)
{
- StringValue(str2);
- return str_casecmp_p(str1, str2);
+ VALUE s = rb_check_string_type(str2);
+ if (NIL_P(s)) {
+ return Qnil;
+ }
+ return str_casecmp_p(str1, s);
}
static VALUE
@@ -9939,7 +9949,6 @@ sym_cmp(VALUE sym, VALUE other)
/*
* call-seq:
- *
* sym.casecmp(other_symbol) -> -1, 0, +1, or nil
*
* Case-insensitive version of <code>Symbol#<=></code>.
@@ -9969,7 +9978,6 @@ sym_casecmp(VALUE sym, VALUE other)
/*
* call-seq:
- *
* sym.casecmp?(other_symbol) -> true, false, or nil
*
* Returns +true+ if +sym+ and +other_symbol+ are equal after