diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-05 20:26:45 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-05 20:26:45 +0000 |
| commit | 20d7ac17c387ae462fe87e05b062559ae6a18877 (patch) | |
| tree | c16384ce9e42296694d732fabfd8590ebb11df3b /transcode.c | |
| parent | dc062b8684c1e34b417649cbe751bc3a861432d8 (diff) | |
| download | ruby-20d7ac17c387ae462fe87e05b062559ae6a18877.tar.gz ruby-20d7ac17c387ae462fe87e05b062559ae6a18877.tar.xz ruby-20d7ac17c387ae462fe87e05b062559ae6a18877.zip | |
* transcode.c (str_encode): no need to duplicate first.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@18379 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
| -rw-r--r-- | transcode.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/transcode.c b/transcode.c index 629da2b76..988e28e74 100644 --- a/transcode.c +++ b/transcode.c @@ -469,6 +469,24 @@ str_transcode(int argc, VALUE *argv, VALUE *self) return to_encidx; } +static inline VALUE +str_encode_associate(VALUE str, int encidx) +{ + int cr = 0; + + rb_enc_associate_index(str, encidx); + + /* transcoded string never be broken. */ + if (rb_enc_asciicompat(rb_enc_from_index(encidx))) { + rb_str_coderange_scan_restartable(RSTRING_PTR(str), RSTRING_END(str), 0, &cr); + } + else { + cr = ENC_CODERANGE_VALID; + } + ENC_CODERANGE_SET(str, cr); + return str; +} + /* * call-seq: * str.encode!(encoding [, options] ) => str @@ -488,21 +506,10 @@ str_encode_bang(int argc, VALUE *argv, VALUE str) { VALUE newstr = str; int encidx = str_transcode(argc, argv, &newstr); - int cr = 0; if (encidx < 0) return str; rb_str_shared_replace(str, newstr); - rb_enc_associate_index(str, encidx); - - /* transcoded string never be broken. */ - if (rb_enc_asciicompat(rb_enc_from_index(encidx))) { - rb_str_coderange_scan_restartable(RSTRING_PTR(str), RSTRING_END(str), 0, &cr); - } - else { - cr = ENC_CODERANGE_VALID; - } - ENC_CODERANGE_SET(str, cr); - return str; + return str_encode_associate(str, encidx); } /* @@ -521,8 +528,12 @@ str_encode_bang(int argc, VALUE *argv, VALUE str) static VALUE str_encode(int argc, VALUE *argv, VALUE str) { - str = rb_str_dup(str); - return str_encode_bang(argc, argv, str); + VALUE newstr = str; + int encidx = str_transcode(argc, argv, &newstr); + + if (encidx < 0) return rb_str_dup(str); + RBASIC(newstr)->klass = rb_obj_class(str); + return str_encode_associate(newstr, encidx); } VALUE |
