[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]