diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-09 14:56:55 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-09 14:56:55 +0000 |
commit | dda64cab99c72081007f4e16ee0507af97d876b8 (patch) | |
tree | 9cac886e1a0142fc971e6171c56e40c4ad6346a0 /io.c | |
parent | 0bbda39758ecf0eac1de04dbd039f8b29299a322 (diff) |
* io.c (io_fwrite): raise an error if ASCII incompatible string
written for text mode IO without encoding conversion.
(rb_io_extract_modeenc): binmode requirement changed.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19273 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -756,6 +756,10 @@ io_fwrite(VALUE str, rb_io_t *fptr) if (fptr->writeconv) { if (!NIL_P(fptr->writeconv_stateless)) common_encoding = fptr->writeconv_stateless; + else if (!rb_enc_asciicompat(rb_enc_get(str))) { + rb_raise(rb_eArgError, "ASCII incompatible string written for text mode IO without encoding conversion: %s", + rb_enc_name(rb_enc_get(str))); + } } else { if (fptr->encs.enc2) @@ -3908,7 +3912,10 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE opthash, if ((fmode & FMODE_BINMODE) && (fmode & FMODE_TEXTMODE)) rb_raise(rb_eArgError, "both textmode and binmode specified"); - if (enc && !rb_enc_asciicompat(enc) && !(fmode & FMODE_BINMODE)) + if ((fmode & FMODE_READABLE) && + !enc2 && + !(fmode & FMODE_BINMODE) && + !rb_enc_asciicompat(enc ? enc : rb_default_external_encoding())) rb_raise(rb_eArgError, "ASCII incompatible encoding needs binmode"); *vmode_p = vmode; |