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

ruby-changes:37163

From: nobu <ko1@a...>
Date: Wed, 14 Jan 2015 15:44:03 +0900 (JST)
Subject: [ruby-changes:37163] nobu:r49244 (trunk): readline.c: initialize before rl_refresh_line

nobu	2015-01-14 15:43:50 +0900 (Wed, 14 Jan 2015)

  New Revision: 49244

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49244

  Log:
    readline.c: initialize before rl_refresh_line
    
    * ext/readline/readline.c (readline_s_refresh_line): initialize
      before rl_refresh_line(), as some function make the internal
      state non-clean but rl_refresh_line() does not re-initialize it.
      [ruby-core:43957] [Bug #6232]

  Modified files:
    trunk/ChangeLog
    trunk/ext/readline/readline.c
    trunk/test/readline/test_readline.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 49243)
+++ ChangeLog	(revision 49244)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Jan 14 15:43:48 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/readline/readline.c (readline_s_refresh_line): initialize
+	  before rl_refresh_line(), as some function make the internal
+	  state non-clean but rl_refresh_line() does not re-initialize it.
+	  [ruby-core:43957] [Bug #6232]
+
 Tue Jan 13 21:59:24 2015  Michal Papis  <mpapis@g...>
 
 	* tool/rbinstall.rb (gem): fix changing permissions of installed
Index: ext/readline/readline.c
===================================================================
--- ext/readline/readline.c	(revision 49243)
+++ ext/readline/readline.c	(revision 49244)
@@ -359,6 +359,34 @@ clear_rl_outstream(void) https://github.com/ruby/ruby/blob/trunk/ext/readline/readline.c#L359
     readline_outstream = Qfalse;
 }
 
+static void
+prepare_readline(void)
+{
+    static int initialized = 0;
+    if (!initialized) {
+	rl_initialize();
+	initialized = 1;
+    }
+
+    if (readline_instream) {
+        rb_io_t *ifp;
+        rb_io_check_initialized(ifp = RFILE(rb_io_taint_check(readline_instream))->fptr);
+        if (ifp->fd < 0) {
+            clear_rl_instream();
+            rb_raise(rb_eIOError, "closed readline input");
+        }
+    }
+
+    if (readline_outstream) {
+        rb_io_t *ofp;
+        rb_io_check_initialized(ofp = RFILE(rb_io_taint_check(readline_outstream))->fptr);
+        if (ofp->fd < 0) {
+            clear_rl_outstream();
+            rb_raise(rb_eIOError, "closed readline output");
+        }
+    }
+}
+
 /*
  * call-seq:
  *   Readline.readline(prompt = "", add_hist = false) -> string or nil
@@ -460,23 +488,7 @@ readline_readline(int argc, VALUE *argv, https://github.com/ruby/ruby/blob/trunk/ext/readline/readline.c#L488
         prompt = RSTRING_PTR(tmp);
     }
 
-    if (readline_instream) {
-        rb_io_t *ifp;
-        rb_io_check_initialized(ifp = RFILE(rb_io_taint_check(readline_instream))->fptr);
-        if (ifp->fd < 0) {
-            clear_rl_instream();
-            rb_raise(rb_eIOError, "closed readline input");
-        }
-    }
-
-    if (readline_outstream) {
-        rb_io_t *ofp;
-        rb_io_check_initialized(ofp = RFILE(rb_io_taint_check(readline_outstream))->fptr);
-        if (ofp->fd < 0) {
-            clear_rl_outstream();
-            rb_raise(rb_eIOError, "closed readline output");
-        }
-    }
+    prepare_readline();
 
 #ifdef _WIN32
     rl_prep_terminal(1);
@@ -1549,6 +1561,7 @@ readline_s_get_filename_quote_characters https://github.com/ruby/ruby/blob/trunk/ext/readline/readline.c#L1561
 static VALUE
 readline_s_refresh_line(VALUE self)
 {
+    prepare_readline();
     rl_refresh_line(0, 0);
     return Qnil;
 }
Index: test/readline/test_readline.rb
===================================================================
--- test/readline/test_readline.rb	(revision 49243)
+++ test/readline/test_readline.rb	(revision 49244)
@@ -448,6 +448,18 @@ class TestReadline < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/readline/test_readline.rb#L448
     Readline::HISTORY.clear
   end if !/EditLine/n.match(Readline::VERSION)
 
+  def test_refresh_line
+    bug6232 = '[ruby-core:43957] [Bug #6232] refresh_line after set_screen_size'
+    with_temp_stdio do |stdin, stdout|
+      replace_stdio(stdin.path, stdout.path) do
+        assert_ruby_status(%w[-rreadline -], <<-'end;', bug6232)
+          Readline.set_screen_size(40, 80)
+          Readline.refresh_line
+        end;
+      end
+    end
+  end if Readline.respond_to?(:refresh_line)
+
   private
 
   def replace_stdio(stdin_path, stdout_path)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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