summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-21 23:29:56 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-21 23:29:56 +0000
commit7f59e105d1dfb85cd6d0fb1d163b904b3d444f6f (patch)
treefe5346d2650b1412357fcc5b32988719589806b6 /string.c
parent5a1cf1c5cb2dd1007389a5c3f2ef5bcecc74a6ac (diff)
* string.c (rb_str_buf_append): improvement for non-broken coded
strings. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14447 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/string.c b/string.c
index f6cbc86f22..03a45a58de 100644
--- a/string.c
+++ b/string.c
@@ -1009,8 +1009,17 @@ rb_str_buf_append(VALUE str, VALUE str2)
{
rb_encoding *enc;
long capa, len;
+ int cr1, cr2;
enc = rb_enc_check(str, str2);
+ cr1 = ENC_CODERANGE(str);
+ cr2 = ENC_CODERANGE(str2);
+ if (cr1 == ENC_CODERANGE_BROKEN || cr2 == ENC_CODERANGE_BROKEN) {
+ cr1 = ENC_CODERANGE_UNKNOWN;
+ }
+ else if (cr2 > cr1) {
+ cr1 = cr2;
+ }
rb_str_modify(str);
if (STR_ASSOC_P(str)) {
FL_UNSET(str, STR_ASSOC);
@@ -1034,6 +1043,9 @@ rb_str_buf_append(VALUE str, VALUE str2)
STR_SET_LEN(str, len);
OBJ_INFECT(str, str2);
rb_enc_associate(str, enc);
+ if (cr1 != ENC_CODERANGE_UNKNOWN) {
+ ENC_CODERANGE_SET(str, cr1);
+ }
return str;
}