diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-17 09:13:04 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-17 09:13:04 +0000 |
commit | 5ef37965fc5d2e773369719744e83466dc7be119 (patch) | |
tree | ff6e0da8c8b077bc6e3d40a9c25ec6decc5c54e5 | |
parent | 7de38fadc056e3951a2bbcf5d94655e27e01c401 (diff) | |
download | ruby-5ef37965fc5d2e773369719744e83466dc7be119.tar.gz |
* transcode.c (str_transcode0): String#encode without argument now
behave as if :undef => :replace, :invalid => :replace specified.
* transcode.c (rb_econv_prepare_opts): should preserve options in
any case.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | transcode.c | 32 |
2 files changed, 24 insertions, 16 deletions
@@ -3,6 +3,14 @@ Fri Oct 17 18:07:17 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> * test/rubygems/gemutilities.rb (RubyGemTestCase#build_rake_in): get rid of interference with other tests. +Fri Oct 17 18:06:39 2008 Yukihiro Matsumoto <matz@ruby-lang.org> + + * transcode.c (str_transcode0): String#encode without argument now + behave as if :undef => :replace, :invalid => :replace specified. + + * transcode.c (rb_econv_prepare_opts): should preserve options in + any case. + Fri Oct 17 11:48:18 2008 Shugo Maeda <shugo@ruby-lang.org> * ext/socket/socket.c (init_sock): sockets should be binmode. diff --git a/transcode.c b/transcode.c index 5031d49989..6d02875051 100644 --- a/transcode.c +++ b/transcode.c @@ -2307,28 +2307,27 @@ rb_econv_prepare_opts(VALUE opthash, VALUE *opts) { int ecflags; VALUE newhash = Qnil; + VALUE v; + if (NIL_P(opthash)) { *opts = Qnil; return 0; } ecflags = econv_opts(opthash); - - if ((ecflags & ECONV_INVALID_MASK) == ECONV_INVALID_REPLACE || - (ecflags & ECONV_UNDEF_MASK) == ECONV_UNDEF_REPLACE) { - VALUE v = rb_hash_aref(opthash, sym_replace); - if (!NIL_P(v)) { - StringValue(v); - if (rb_enc_str_coderange(v) == ENC_CODERANGE_BROKEN) { - VALUE dumped = rb_str_dump(v); - rb_raise(rb_eArgError, "replacement string is broken: %s as %s", - StringValueCStr(dumped), - rb_enc_name(rb_enc_get(v))); - } - v = rb_str_new_frozen(v); - newhash = rb_hash_new(); - rb_hash_aset(newhash, sym_replace, v); - } + v = rb_hash_aref(opthash, sym_replace); + if (!NIL_P(v)) { + StringValue(v); + if (rb_enc_str_coderange(v) == ENC_CODERANGE_BROKEN) { + VALUE dumped = rb_str_dump(v); + rb_raise(rb_eArgError, "replacement string is broken: %s as %s", + StringValueCStr(dumped), + rb_enc_name(rb_enc_get(v))); + } + v = rb_str_new_frozen(v); + newhash = rb_hash_new(); + rb_hash_aset(newhash, sym_replace, v); } + if (!NIL_P(newhash)) rb_hash_freeze(newhash); *opts = newhash; @@ -2444,6 +2443,7 @@ str_transcode0(int argc, VALUE *argv, VALUE *self, int ecflags, VALUE ecopts) if (NIL_P(arg1)) { return -1; } + ecflags |= ECONV_INVALID_REPLACE | ECONV_UNDEF_REPLACE; } else { arg1 = argv[0]; |