diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-24 02:40:55 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-24 02:40:55 +0000 |
commit | 37855698ffd3ae3080304f08b0ec75df68ba0c8b (patch) | |
tree | 4a5e878650df1fcb297d83ff34ce85af4f668089 /string.c | |
parent | 7c92ab16a9d911e61cccb8c030956bd3354238e4 (diff) |
* string.c (rb_str_comparable): fixed to keep transitivity.
[ruby-dev:32693]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14568 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 18 |
1 files changed, 14 insertions, 4 deletions
@@ -1274,10 +1274,15 @@ rb_str_comparable(VALUE str1, VALUE str2) if (idx1 == idx2) return Qtrue; rc1 = rb_enc_str_coderange(str1); rc2 = rb_enc_str_coderange(str2); - if (rc1 == ENC_CODERANGE_7BIT && rc2 == ENC_CODERANGE_7BIT) - return Qtrue; - if (rc1 == ENC_CODERANGE_BROKEN) return Qtrue; - if (rc2 == ENC_CODERANGE_BROKEN) return Qtrue; + if (rc1 == ENC_CODERANGE_7BIT) { + if (rc2 == ENC_CODERANGE_7BIT) return Qtrue; + if (rb_enc_asciicompat(rb_enc_from_index(idx1))) + return Qtrue; + } + if (rc2 == ENC_CODERANGE_7BIT) { + if (rb_enc_asciicompat(rb_enc_from_index(idx2))) + return Qtrue; + } return Qfalse; } @@ -1293,6 +1298,11 @@ rb_str_cmp(VALUE str1, VALUE str2) retval = memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len); if (retval == 0) { if (RSTRING_LEN(str1) == RSTRING_LEN(str2)) { + if (!enc) { + if (rb_enc_get(str1) - rb_enc_get(str2) > 0) + return 1; + return -1; + } return 0; } if (RSTRING_LEN(str1) > RSTRING_LEN(str2)) return 1; |