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/