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

ruby-changes:16695

From: nobu <ko1@a...>
Date: Tue, 20 Jul 2010 18:39:35 +0900 (JST)
Subject: [ruby-changes:16695] Ruby:r28691 (trunk): * include/ruby/ruby.h (RSTRING_GETMEM): new macro to get ptr and

nobu	2010-07-20 18:39:22 +0900 (Tue, 20 Jul 2010)

  New Revision: 28691

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28691

  Log:
    * include/ruby/ruby.h (RSTRING_GETMEM): new macro to get ptr and
      len at once.
    
    * string.c (rb_str_cmp, str_eql, rb_str_eql): trivial improvements.

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/ruby.h
    trunk/string.c

Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 28690)
+++ include/ruby/ruby.h	(revision 28691)
@@ -647,10 +647,12 @@
 #define RSTRING_NOEMBED FL_USER1
 #define RSTRING_EMBED_LEN_MASK (FL_USER2|FL_USER3|FL_USER4|FL_USER5|FL_USER6)
 #define RSTRING_EMBED_LEN_SHIFT (FL_USHIFT+2)
+#define RSTRING_EMBED_LEN(str) \
+     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
+            (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT))
 #define RSTRING_LEN(str) \
     (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
-     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
-            (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT)) : \
+     RSTRING_EMBED_LEN(str) : \
      RSTRING(str)->as.heap.len)
 #define RSTRING_PTR(str) \
     (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
@@ -658,11 +660,13 @@
      RSTRING(str)->as.heap.ptr)
 #define RSTRING_END(str) \
     (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
-     (RSTRING(str)->as.ary + \
-      ((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
-       (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT))) : \
+     (RSTRING(str)->as.ary + RSTRING_EMBED_LEN(str)) : \
      (RSTRING(str)->as.heap.ptr + RSTRING(str)->as.heap.len))
 #define RSTRING_LENINT(str) rb_long2int(RSTRING_LEN(str))
+#define RSTRING_GETMEM(str, ptrvar, lenvar) \
+    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
+     ((ptrvar) = RSTRING(str)->as.ary, (lenvar) = RSTRING_EMBED_LEN(str)) : \
+     ((ptrvar) = RSTRING(str)->as.heap.ptr, (lenvar) = RSTRING(str)->as.heap.len))
 
 #define RARRAY_EMBED_LEN_MAX 3
 struct RArray {
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28690)
+++ ChangeLog	(revision 28691)
@@ -1,3 +1,10 @@
+Tue Jul 20 18:39:18 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* include/ruby/ruby.h (RSTRING_GETMEM): new macro to get ptr and
+	  len at once.
+
+	* string.c (rb_str_cmp, str_eql, rb_str_eql): trivial improvements.
+
 Tue Jul 20 18:23:04 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/fiddle/closure.c (closure_data_type),
Index: string.c
===================================================================
--- string.c	(revision 28690)
+++ string.c	(revision 28691)
@@ -2100,13 +2100,15 @@
 int
 rb_str_cmp(VALUE str1, VALUE str2)
 {
-    long len;
+    long len1, len2;
+    const char *ptr1, *ptr2;
     int retval;
 
-    len = lesser(RSTRING_LEN(str1), RSTRING_LEN(str2));
-    retval = memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len);
-    if (retval == 0) {
-	if (RSTRING_LEN(str1) == RSTRING_LEN(str2)) {
+    if (str1 == str2) return 0;
+    RSTRING_GETMEM(str1, ptr1, len1);
+    RSTRING_GETMEM(str2, ptr2, len2);
+    if (ptr1 == ptr2 || (retval = memcmp(ptr1, ptr2, lesser(len1, len2))) == 0) {
+	if (len1 == len2) {
 	    if (!rb_str_comparable(str1, str2)) {
 		if (ENCODING_GET(str1) > ENCODING_GET(str2))
 		    return 1;
@@ -2114,7 +2116,7 @@
 	    }
 	    return 0;
 	}
-	if (RSTRING_LEN(str1) > RSTRING_LEN(str2)) return 1;
+	if (len1 > len2) return 1;
 	return -1;
     }
     if (retval > 0) return 1;
@@ -2126,11 +2128,14 @@
 str_eql(const VALUE str1, const VALUE str2)
 {
     const long len = RSTRING_LEN(str1);
+    const char *ptr1, *ptr2;
 
     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)
+    if ((ptr1 = RSTRING_PTR(str1)) == (ptr2 = RSTRING_PTR(str2)))
 	return Qtrue;
+    if (memcmp(ptr1, ptr2, len) == 0)
+	return Qtrue;
     return Qfalse;
 }
 /*
@@ -2165,6 +2170,7 @@
 static VALUE
 rb_str_eql(VALUE str1, VALUE str2)
 {
+    if (str1 == str2) return Qtrue;
     if (TYPE(str2) != T_STRING) return Qfalse;
     return str_eql(str1, str2);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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