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

ruby-changes:22205

From: nobu <ko1@a...>
Date: Tue, 10 Jan 2012 10:41:31 +0900 (JST)
Subject: [ruby-changes:22205] nobu:r34254 (trunk): * ext/readline/readline.c (readline_attempted_completion_function):

nobu	2012-01-10 10:41:15 +0900 (Tue, 10 Jan 2012)

  New Revision: 34254

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

  Log:
    * ext/readline/readline.c (readline_attempted_completion_function):
      empty completion result does not mean memory error.

  Modified files:
    trunk/ChangeLog
    trunk/ext/readline/readline.c
    trunk/test/readline/test_readline.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34253)
+++ ChangeLog	(revision 34254)
@@ -1,3 +1,8 @@
+Tue Jan 10 10:41:11 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/readline/readline.c (readline_attempted_completion_function):
+	  empty completion result does not mean memory error.
+
 Tue Jan 10 02:19:22 2012  CHIKANAGA Tomoyuki  <nagachika00@g...>
 
 	* test/ruby/test_io.rb (test_autoclose_true_closed_by_finalizer,
Index: ext/readline/readline.c
===================================================================
--- ext/readline/readline.c	(revision 34253)
+++ ext/readline/readline.c	(revision 34254)
@@ -667,10 +667,10 @@
 #endif
     case_fold = RTEST(rb_attr_get(mReadline, completion_case_fold));
     ary = rb_funcall(proc, rb_intern("call"), 1, rb_locale_str_new_cstr(text));
-    if (TYPE(ary) != T_ARRAY)
+    if (!RB_TYPE_P(ary, T_ARRAY)) {
 	ary = rb_Array(ary);
     matches = RARRAY_LEN(ary);
-    if (matches == NULL) rb_memerror();
+    if (matches == 0) return NULL;
     result = (char**)malloc((matches + 2)*sizeof(char*));
     if (result == NULL) rb_raise(rb_eNoMemError, "failed to allocate memory");
     for (i = 0; i < matches; i++) {
Index: test/readline/test_readline.rb
===================================================================
--- test/readline/test_readline.rb	(revision 34253)
+++ test/readline/test_readline.rb	(revision 34254)
@@ -85,9 +85,7 @@
 
   if !/EditLine/n.match(Readline::VERSION)
     def test_readline
-      stdin = Tempfile.new("test_readline_stdin")
-      stdout = Tempfile.new("test_readline_stdout")
-      begin
+      with_temp_stdio do |stdin, stdout|
         stdin.write("hello\n")
         stdin.close
         stdout.close
@@ -114,9 +112,6 @@
             replace_stdio(stdin.path, stdout.path) { Readline.readline("> ") }
           }.join
         end
-      ensure
-        stdin.close(true)
-        stdout.close(true)
       end
     end
 
@@ -130,9 +125,7 @@
         return
       end
 
-      stdin = Tempfile.new("test_readline_stdin")
-      stdout = Tempfile.new("test_readline_stdout")
-      begin
+      with_temp_stdio do |stdin, stdout|
         actual_text = nil
         actual_line_buffer = nil
         actual_point = nil
@@ -176,9 +169,6 @@
         assert_equal(Encoding.find("locale"), Readline.line_buffer.encoding)
         assert_equal(true, Readline.line_buffer.tainted?)
         assert_equal(21, Readline.point)
-      ensure
-        stdin.close(true)
-        stdout.close(true)
       end
     end
   end
@@ -213,6 +203,19 @@
     end
   end
 
+  def test_completion_proc_empty_result
+    with_temp_stdio do |stdin, stdout|
+      stdin.write("first\t")
+      stdin.flush
+      actual_text = nil
+      Readline.completion_proc = ->(text) {[]}
+      line = replace_stdio(stdin.path, stdout.path) {
+        Readline.readline("> ")
+      }
+      assert_equal("first", line)
+    end
+  end
+
   def test_get_screen_size
     begin
       res = Readline.get_screen_size
@@ -336,6 +339,15 @@
     }
   end
 
+  def with_temp_stdio
+    stdin = Tempfile.new("test_readline_stdin")
+    stdout = Tempfile.new("test_readline_stdout")
+    yield stdin, stdout
+  ensure
+    stdin.close(true) if stdin
+    stdout.close(true) if stdout
+  end
+
   def get_default_internal_encoding
     return Encoding.default_internal || Encoding.find("locale")
   end

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

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