Project

General

Profile

Feature #11358 ยป 0001-io.c-argf_read_nonblock-support-exception-false.patch

normalperson (Eric Wong), 07/16/2015 10:02 AM

View differences:

io.c
return ret;
}
static VALUE
io_nonblock_eof(VALUE opts)
{
if (!no_exception_p(opts)) {
rb_eof_error();
}
return Qnil;
}
/*
* call-seq:
* ios.read_nonblock(maxlen) -> string
......
ret = io_getpartial(argc, argv, io, opts, 1);
if (NIL_P(ret)) {
if (no_exception_p(opts))
return Qnil;
else
rb_eof_error();
return io_nonblock_eof(opts);
}
return ret;
}
......
return Qnil;
}
static VALUE argf_getpartial(int argc, VALUE *argv, VALUE argf, int nonblock);
static VALUE argf_getpartial(int argc, VALUE *argv, VALUE argf, VALUE opts,
int nonblock);
/*
* call-seq:
......
static VALUE
argf_readpartial(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 0);
return argf_getpartial(argc, argv, argf, Qnil, 0);
}
/*
......
static VALUE
argf_read_nonblock(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 1);
VALUE opts;
rb_scan_args(argc, argv, "11:", NULL, NULL, &opts);
if (!NIL_P(opts))
argc--;
return argf_getpartial(argc, argv, argf, opts, 1);
}
static VALUE
argf_getpartial(int argc, VALUE *argv, VALUE argf, int nonblock)
argf_getpartial(int argc, VALUE *argv, VALUE argf, VALUE opts, int nonblock)
{
VALUE tmp, str, length;
......
RUBY_METHOD_FUNC(0), Qnil, rb_eEOFError, (VALUE)0);
}
else {
tmp = io_getpartial(argc, argv, ARGF.current_file, Qnil, nonblock);
tmp = io_getpartial(argc, argv, ARGF.current_file, opts, nonblock);
}
if (NIL_P(tmp)) {
if (ARGF.next_p == -1) {
rb_eof_error();
return io_nonblock_eof(opts);
}
argf_close(argf);
ARGF.next_p = 1;
if (RARRAY_LEN(ARGF.argv) == 0)
rb_eof_error();
if (RARRAY_LEN(ARGF.argv) == 0) {
return io_nonblock_eof(opts);
}
if (NIL_P(str))
str = rb_str_new(NULL, 0);
return str;
test/ruby/test_argf.rb
assert_equal([49, 10, 50, 10, 51, 10, 52, 10, 53, 10, 54, 10], Marshal.load(f.read))
end
end
def test_read_nonblock
ruby('-e', <<-SRC) do |f|
$stdout.sync = true
:wait_readable == ARGF.read_nonblock(1, "", exception: false) or
abort "did not return :wait_readable"
begin
ARGF.read_nonblock(1)
abort 'fail to raise IO::WaitReadable'
rescue IO::WaitReadable
end
puts 'starting select'
IO.select([ARGF]) == [[ARGF], [], []] or
abort 'did not awaken for readability (before byte)'
buf = ''
buf.object_id == ARGF.read_nonblock(1, buf).object_id or
abort "read destination buffer failed"
print buf
IO.select([ARGF]) == [[ARGF], [], []] or
abort 'did not awaken for readability (before EOF)'
ARGF.read_nonblock(1, buf, exception: false) == nil or
abort "EOF should return nil if exception: false"
begin
ARGF.read_nonblock(1, buf)
abort 'fail to raise IO::WaitReadable'
rescue EOFError
puts 'done with eof'
end
SRC
f.sync = true
assert_equal "starting select\n", f.gets
f.write('.') # wake up from IO.select
assert_equal '.', f.read(1)
f.close_write
assert_equal "done with eof\n", f.gets
end
end
end
-
    (1-1/1)