aboutsummaryrefslogtreecommitdiffstats
path: root/transcode.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-05 20:26:45 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-05 20:26:45 +0000
commit29732ed8f2cd897993e55435761a3952cca168eb (patch)
treec16384ce9e42296694d732fabfd8590ebb11df3b /transcode.c
parentf1ff09fbf62a1db3991efef5c1d0e53feffdfb6b (diff)
downloadruby-29732ed8f2cd897993e55435761a3952cca168eb.tar.gz
* transcode.c (str_encode): no need to duplicate first.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18379 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/transcode.c b/transcode.c
index 629da2b760..988e28e743 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