summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--ext/readline/readline.c8
-rw-r--r--test/readline/test_readline.rb36
-rw-r--r--version.h2
4 files changed, 39 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index ccd096eff1..d1238542ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Feb 8 10:56:00 2012 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * ext/readline/readline.c (readline_attempted_completion_function):
+ fix compile error.
+
+Wed Feb 8 10:56:00 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/readline/readline.c (readline_attempted_completion_function):
+ empty completion result does not mean memory error.
+
Wed Feb 8 10:54:49 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/readline/readline.c (readline_readline): check if outstream
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 34ce023bea..eb163e1af4 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -667,12 +667,12 @@ readline_attempted_completion_function(const char *text, int start, int end)
#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 == 0)
- return NULL;
- result = ALLOC_N(char *, matches + 2);
+ 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++) {
temp = rb_obj_as_string(RARRAY_PTR(ary)[i]);
result[i + 1] = ALLOC_N(char, RSTRING_LEN(temp) + 1);
diff --git a/test/readline/test_readline.rb b/test/readline/test_readline.rb
index b2e67ec1b1..0dae5ba146 100644
--- a/test/readline/test_readline.rb
+++ b/test/readline/test_readline.rb
@@ -85,9 +85,7 @@ class TestReadline < Test::Unit::TestCase
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 @@ class TestReadline < Test::Unit::TestCase
replace_stdio(stdin.path, stdout.path) { Readline.readline("> ") }
}.join
end
- ensure
- stdin.close(true)
- stdout.close(true)
end
end
@@ -130,9 +125,7 @@ class TestReadline < Test::Unit::TestCase
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
@@ -156,9 +149,6 @@ class TestReadline < Test::Unit::TestCase
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
@@ -193,6 +183,19 @@ class TestReadline < Test::Unit::TestCase
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
@@ -316,6 +319,15 @@ class TestReadline < Test::Unit::TestCase
}
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
diff --git a/version.h b/version.h
index 2173170018..3040b79cca 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 62
+#define RUBY_PATCHLEVEL 63
#define RUBY_RELEASE_DATE "2012-02-08"
#define RUBY_RELEASE_YEAR 2012