[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]