aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-29 14:38:44 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-29 14:38:44 +0000
commitbe9994a03ae32b5cd4a799b20ed96c3aaaba97b7 (patch)
treeabd38e3e99366b296bd3eac1fef12638d9ab20f0
parentd866ba69a1605a390155fe5401f11fdc0f010668 (diff)
downloadruby-be9994a03ae32b5cd4a799b20ed96c3aaaba97b7.tar.gz
* io.c (io_ungetc): raise NotImplementedError when ungetc is called
against dummy encoding IO. * io.c (rb_io_getline_1): ditto when gets with delimiter is called. * io.c (io_getc): ditto when getc is called. * test/ruby/test_io_m17n.rb (test_terminator_stateful_conversion, test_getc_stateful_conversion, test_ungetc_stateful_conversion): these tests should raise NotImplementedError. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog13
-rw-r--r--io.c13
-rw-r--r--test/ruby/test_io_m17n.rb37
3 files changed, 54 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 33ecbfd391..ab91451cda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Tue Jul 29 23:37:37 2008 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * io.c (io_ungetc): raise NotImplementedError when ungetc is called
+ against dummy encoding IO.
+
+ * io.c (rb_io_getline_1): ditto when gets with delimiter is called.
+
+ * io.c (io_getc): ditto when getc is called.
+
+ * test/ruby/test_io_m17n.rb (test_terminator_stateful_conversion,
+ test_getc_stateful_conversion, test_ungetc_stateful_conversion):
+ these tests should raise NotImplementedError.
+
Tue Jul 29 22:55:34 2008 Yusuke Endoh <mame@tsg.ne.jp>
* test/ruby/test_io.rb (pipe): run reader thread and writer thread.
diff --git a/io.c b/io.c
index 52216cff43..72db537873 100644
--- a/io.c
+++ b/io.c
@@ -323,11 +323,17 @@ io_unread(rb_io_t *fptr)
return;
}
+static rb_encoding *io_input_encoding(rb_io_t *fptr);
+
static void
io_ungetc(VALUE str, rb_io_t *fptr)
{
int len = RSTRING_LEN(str);
+ if (rb_enc_dummy_p(io_input_encoding(fptr))) {
+ rb_raise(rb_eNotImpError, "ungetc against dummy encoding is not currently supported");
+ }
+
if (fptr->rbuf == NULL) {
fptr->rbuf_off = 0;
fptr->rbuf_len = 0;
@@ -1950,6 +1956,9 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io)
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
+ if (rb_enc_dummy_p(io_input_encoding(fptr)) && rs != rb_default_rs) {
+ rb_raise(rb_eNotImpError, "gets with delimiter against dummy encoding is not currently supported");
+ }
if (NIL_P(rs)) {
str = read_all(fptr, 0, Qnil);
if (RSTRING_LEN(str) == 0) return Qnil;
@@ -2265,6 +2274,10 @@ io_getc(rb_io_t *fptr, rb_encoding *enc)
int r, n, cr = 0;
VALUE str;
+ if (rb_enc_dummy_p(enc)) {
+ rb_raise(rb_eNotImpError, "getc against dummy encoding is not currently supported");
+ }
+
if (io_fillbuf(fptr) < 0) {
return Qnil;
}
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 585e5aeadd..bc9c6f34ce 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -161,11 +161,13 @@ EOT
with_tmpdir {
src = "before \e$B\x23\x30\x23\x31\e(B after".force_encoding("iso-2022-jp")
generate_file('tmp', src)
- s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
- f.gets("0".force_encoding("euc-jp"))
- }
- assert_equal(Encoding.find("euc-jp"), s.encoding)
- assert_str_equal(src.encode("euc-jp"), s)
+ assert_raise(NotImplementedError) do
+ s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
+ f.gets("0".force_encoding("euc-jp"))
+ }
+ assert_equal(Encoding.find("euc-jp"), s.encoding)
+ assert_str_equal(src.encode("euc-jp"), s)
+ end
}
end
@@ -218,10 +220,27 @@ EOT
with_tmpdir {
src = "\e$B\x23\x30\x23\x31\e(B".force_encoding("iso-2022-jp")
generate_file('tmp', src)
- open("tmp", "r:iso-2022-jp:euc-jp") {|f|
- assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
- assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
- }
+ assert_raise(NotImplementedError) do
+ open("tmp", "r:iso-2022-jp:euc-jp") {|f|
+ assert_equal("\xa3\xb0".force_encoding("euc-jp"), f.getc)
+ assert_equal("\xa3\xb1".force_encoding("euc-jp"), f.getc)
+ }
+ end
+ }
+ end
+
+ def test_ungetc_stateful_conversion
+ with_tmpdir {
+ src = "before \e$B\x23\x30\x23\x31\e(B after".force_encoding("iso-2022-jp")
+ generate_file('tmp', src)
+ assert_raise(NotImplementedError) do
+ s = open("tmp", "r:iso-2022-jp:euc-jp") {|f|
+ f.ungetc("0".force_encoding("euc-jp"))
+ f.read
+ }
+ assert_equal(Encoding.find("euc-jp"), s.encoding)
+ assert_str_equal(("0" + src).encode("euc-jp"), s)
+ end
}
end