ruby-changes:11170
From: nobu <ko1@a...>
Date: Thu, 5 Mar 2009 10:29:28 +0900 (JST)
Subject: [ruby-changes:11170] Ruby:r22775 (trunk): * string.c (str_eql): extracted from rb_str_equal and rb_str_eql.
nobu 2009-03-05 10:29:12 +0900 (Thu, 05 Mar 2009) New Revision: 22775 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22775 Log: * string.c (str_eql): extracted from rb_str_equal and rb_str_eql. Modified files: trunk/ChangeLog trunk/string.c Index: ChangeLog =================================================================== --- ChangeLog (revision 22774) +++ ChangeLog (revision 22775) @@ -1,5 +1,7 @@ -Thu Mar 5 10:24:56 2009 Nobuyoshi Nakada <nobu@r...> +Thu Mar 5 10:29:10 2009 Nobuyoshi Nakada <nobu@r...> + * string.c (str_eql): extracted from rb_str_equal and rb_str_eql. + * string.c (rb_str_chomp_bang): keeps 7bit coderange. Thu Mar 5 10:10:40 2009 Nobuyoshi Nakada <nobu@r...> Index: string.c =================================================================== --- string.c (revision 22774) +++ string.c (revision 22775) @@ -2227,7 +2227,18 @@ return -1; } +/* expect tail call optimization */ +static VALUE +str_eql(const VALUE str1, const VALUE str2) +{ + const long len = RSTRING_LEN(str1); + if (len != RSTRING_LEN(str2)) return Qfalse; + if (!rb_str_comparable(str1, str2)) return Qfalse; + if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len) == 0) + return Qtrue; + return Qfalse; +} /* * call-seq: * str == obj => true or false @@ -2240,8 +2251,6 @@ VALUE rb_str_equal(VALUE str1, VALUE str2) { - int len; - if (str1 == str2) return Qtrue; if (TYPE(str2) != T_STRING) { if (!rb_respond_to(str2, rb_intern("to_str"))) { @@ -2249,12 +2258,7 @@ } return rb_equal(str2, str1); } - if (!rb_str_comparable(str1, str2)) return Qfalse; - if (RSTRING_LEN(str1) == (len = RSTRING_LEN(str2)) && - memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len) == 0) { - return Qtrue; - } - return Qfalse; + return str_eql(str1, str2); } /* @@ -2267,15 +2271,8 @@ static VALUE rb_str_eql(VALUE str1, VALUE str2) { - if (TYPE(str2) != T_STRING || RSTRING_LEN(str1) != RSTRING_LEN(str2)) - return Qfalse; - - if (!rb_str_comparable(str1, str2)) return Qfalse; - if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), - lesser(RSTRING_LEN(str1), RSTRING_LEN(str2))) == 0) - return Qtrue; - - return Qfalse; + if (TYPE(str2) != T_STRING) return Qfalse; + return str_eql(str1, str2); } /* -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/