Skip to content

Commit

Permalink
* ext/stringio/stringio.c (strio_read): return new string if nil
Browse files Browse the repository at this point in the history
  is explicitly given as a buffer ([Bug ruby#5207]), otherwise set the
  encoding.  also removed dead code.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33010 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed Aug 20, 2011
1 parent e9930a4 commit dcb7cc1
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
Sat Aug 20 10:43:24 2011 Nobuyoshi Nakada <[email protected]>

* ext/stringio/stringio.c (strio_read): return new string if nil
is explicitly given as a buffer ([Bug #5207]), otherwise set the
encoding. also removed dead code.

Fri Aug 19 14:25:51 2011 Nobuyoshi Nakada <[email protected]>

* process.c (proc_spawn_v, proc_spawn): should not wait the
Expand Down
22 changes: 12 additions & 10 deletions ext/stringio/stringio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1219,12 +1219,15 @@ strio_read(int argc, VALUE *argv, VALUE self)
struct StringIO *ptr = readable(StringIO(self));
VALUE str = Qnil;
long len;
int binary = 0;

switch (argc) {
case 2:
str = argv[1];
StringValue(str);
rb_str_modify(str);
if (!NIL_P(str)) {
StringValue(str);
rb_str_modify(str);
}
case 1:
if (!NIL_P(argv[0])) {
len = NUM2LONG(argv[0]);
Expand All @@ -1235,6 +1238,7 @@ strio_read(int argc, VALUE *argv, VALUE self)
if (!NIL_P(str)) rb_str_resize(str, 0);
return Qnil;
}
binary = 1;
break;
}
/* fall through */
Expand All @@ -1258,21 +1262,19 @@ strio_read(int argc, VALUE *argv, VALUE self)
}
if (NIL_P(str)) {
str = strio_substr(ptr, ptr->pos, len);
if (argc > 0) rb_enc_associate(str, rb_ascii8bit_encoding());
if (binary) rb_enc_associate(str, rb_ascii8bit_encoding());
}
else {
long rest = RSTRING_LEN(ptr->string) - ptr->pos;
if (len > rest) len = rest;
rb_str_resize(str, len);
MEMCPY(RSTRING_PTR(str), RSTRING_PTR(ptr->string) + ptr->pos, char, len);
if (binary)
rb_enc_associate(str, rb_ascii8bit_encoding());
else
rb_enc_copy(str, ptr->string);
}
if (NIL_P(str)) {
str = rb_str_new(0, 0);
len = 0;
}
else {
ptr->pos += len = RSTRING_LEN(str);
}
ptr->pos += RSTRING_LEN(str);
return str;
}

Expand Down
8 changes: 8 additions & 0 deletions test/stringio/test_stringio.rb
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,14 @@ def test_read
assert_equal("\u3042\u3044", f.read)
f.rewind
assert_equal("\u3042\u3044".force_encoding(Encoding::ASCII_8BIT), f.read(f.size))

bug5207 = '[ruby-core:39026]'
f.rewind
assert_equal("\u3042\u3044", f.read(nil, nil), bug5207)
f.rewind
s = ""
f.read(nil, s)
assert_equal("\u3042\u3044", s, bug5207)
end

def test_readpartial
Expand Down

0 comments on commit dcb7cc1

Please sign in to comment.