summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/stringio/stringio.c26
-rw-r--r--test/stringio/test_stringio.rb2
-rw-r--r--version.h2
4 files changed, 23 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index be6be7b2bd..9f12bfd546 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Apr 8 16:01:56 2011 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_getline): check whether str is
+ a string when str and lim are given.
+ https://twitter.com/watson1978/status/56225052152168449
+
Wed Apr 6 15:12:40 2011 NARUSE, Yui <naruse@ruby-lang.org>
* ext/openssl/ossl_pkey_dh.c (ossl_dh_initialize):
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 6ee9599619..3ca5001fe0 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -919,18 +919,17 @@ strio_getline(int argc, VALUE *argv, struct StringIO *ptr)
{
const char *s, *e, *p;
long n, limit = 0;
- VALUE str;
+ VALUE str, lim;
- if (argc == 0) {
+ rb_scan_args(argc, argv, "02", &str, &lim);
+ switch (argc) {
+ case 0:
str = rb_rs;
- }
- else {
- VALUE lim, tmp;
+ break;
- rb_scan_args(argc, argv, "11", &str, &lim);
- if (!NIL_P(lim)) limit = NUM2LONG(lim);
- else if (!NIL_P(str) && TYPE(str) != T_STRING) {
- tmp = rb_check_string_type(str);
+ case 1:
+ if (!NIL_P(str) && TYPE(str) != T_STRING) {
+ VALUE tmp = rb_check_string_type(str);
if (NIL_P(tmp)) {
limit = NUM2LONG(str);
if (limit == 0) return rb_str_new(0,0);
@@ -940,9 +939,12 @@ strio_getline(int argc, VALUE *argv, struct StringIO *ptr)
str = tmp;
}
}
- else if (!NIL_P(str)) {
- StringValue(str);
- }
+ break;
+
+ case 2:
+ if (!NIL_P(str)) StringValue(str);
+ limit = NUM2LONG(lim);
+ break;
}
if (ptr->pos >= (n = RSTRING_LEN(ptr->string))) {
diff --git a/test/stringio/test_stringio.rb b/test/stringio/test_stringio.rb
index 78718a2d86..c581681817 100644
--- a/test/stringio/test_stringio.rb
+++ b/test/stringio/test_stringio.rb
@@ -51,6 +51,8 @@ class TestStringIO < Test::Unit::TestCase
assert_equal("abc\n", StringIO.new("abc\n\ndef\n").gets)
assert_equal("abc\n\ndef\n", StringIO.new("abc\n\ndef\n").gets(nil))
assert_equal("abc\n\n", StringIO.new("abc\n\ndef\n").gets(""))
+ assert_raise(TypeError){StringIO.new("").gets(1, 1)}
+ assert_raise(TypeError){StringIO.new("").gets(nil, nil)}
end
def test_readlines
diff --git a/version.h b/version.h
index 49160c6900..449e4aa1a4 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.2"
-#define RUBY_PATCHLEVEL 224
+#define RUBY_PATCHLEVEL 225
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 1