Feature #11358 ยป 0001-io.c-argf_read_nonblock-support-exception-false.patch
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
|
||
-
|