ruby-changes:6745
From: mame <ko1@a...>
Date: Tue, 29 Jul 2008 23:39:04 +0900 (JST)
Subject: [ruby-changes:6745] Ruby:r18261 (trunk): * io.c (io_ungetc): raise NotImplementedError when ungetc is called
mame 2008-07-29 23:38:44 +0900 (Tue, 29 Jul 2008) New Revision: 18261 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18261 Log: * 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. Modified files: trunk/ChangeLog trunk/io.c trunk/test/ruby/test_io_m17n.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 18260) +++ ChangeLog (revision 18261) @@ -1,3 +1,16 @@ +Tue Jul 29 23:37:37 2008 Yusuke Endoh <mame@t...> + + * 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@t...> * test/ruby/test_io.rb (pipe): run reader thread and writer thread. Index: io.c =================================================================== --- io.c (revision 18260) +++ io.c (revision 18261) @@ -323,11 +323,17 @@ 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 @@ 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 @@ 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; } Index: test/ruby/test_io_m17n.rb =================================================================== --- test/ruby/test_io_m17n.rb (revision 18260) +++ test/ruby/test_io_m17n.rb (revision 18261) @@ -161,11 +161,13 @@ 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,13 +220,30 @@ 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 + def test_open_ascii with_tmpdir { src = "abc\n" -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/