string.c: cmp orders
* string.c (fstring_cmp, rb_str_hash_cmp): compare lengths first, then encodings, and contents at last. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
22be6d06ab
commit
502004f617
27
string.c
27
string.c
@ -367,11 +367,13 @@ fstring_set_class_i(st_data_t key, st_data_t val, st_data_t arg)
|
||||
static int
|
||||
fstring_cmp(VALUE a, VALUE b)
|
||||
{
|
||||
int cmp = rb_str_hash_cmp(a, b);
|
||||
if (cmp != 0) {
|
||||
return cmp;
|
||||
}
|
||||
return ENCODING_GET(b) - ENCODING_GET(a);
|
||||
long alen, blen;
|
||||
const char *aptr, *bptr;
|
||||
RSTRING_GETMEM(a, aptr, alen);
|
||||
RSTRING_GETMEM(b, bptr, blen);
|
||||
return (alen != blen ||
|
||||
ENCODING_GET(a) != ENCODING_GET(b) ||
|
||||
memcmp(aptr, bptr, alen) != 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@ -2576,14 +2578,13 @@ rb_str_hash(VALUE str)
|
||||
int
|
||||
rb_str_hash_cmp(VALUE str1, VALUE str2)
|
||||
{
|
||||
long len;
|
||||
|
||||
if (!rb_str_comparable(str1, str2)) return 1;
|
||||
if (RSTRING_LEN(str1) == (len = RSTRING_LEN(str2)) &&
|
||||
memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len) == 0) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
long len1, len2;
|
||||
const char *ptr1, *ptr2;
|
||||
RSTRING_GETMEM(str1, ptr1, len1);
|
||||
RSTRING_GETMEM(str2, ptr2, len2);
|
||||
return (len1 != len2 ||
|
||||
!rb_str_comparable(str1, str2) ||
|
||||
memcmp(ptr1, ptr2, len1) != 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user