From 653b4248a306685e0cdd86bf46c27a0ef03f9c7c Mon Sep 17 00:00:00 2001 From: naruse Date: Fri, 8 Apr 2011 07:50:49 +0000 Subject: [PATCH] * ext/stringio/stringio.c (strio_getline): check whether str is a string when str and lim are given. https://twitter.com/watson1978/status/56225052152168449 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31248 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/stringio/stringio.c | 26 ++++++++++++++------------ test/stringio/test_stringio.rb | 2 ++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5ea22d1f2..7969356c1f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Apr 8 16:01:56 2011 NARUSE, Yui + + * ext/stringio/stringio.c (strio_getline): check whether str is + a string when str and lim are given. + https://twitter.com/watson1978/status/56225052152168449 + Thu Apr 7 20:03:52 2011 Tanaka Akira * include/ruby/io.h: parenthesize macro arguments. diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index 594813cbc0..da4eb964cb 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -921,18 +921,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); @@ -942,9 +941,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