[ruby/io-wait] Remove IO#nread and `IO#ready?

https://github.com/ruby/io-wait/commit/1decadc7f9
This commit is contained in:
Nobuyoshi Nakada 2025-11-04 21:42:54 +09:00 committed by git
parent b1c578d83e
commit b70f5afb68
4 changed files with 1 additions and 155 deletions

View File

@ -1,21 +1,6 @@
# frozen_string_literal: false
require 'mkmf'
target = "io/wait"
have_func("rb_io_wait", "ruby/io.h")
have_func("rb_io_descriptor", "ruby/io.h")
unless macro_defined?("DOSISH", "#include <ruby.h>")
have_header(ioctl_h = "sys/ioctl.h") or ioctl_h = nil
fionread = %w[sys/ioctl.h sys/filio.h sys/socket.h].find do |h|
have_macro("FIONREAD", [h, ioctl_h].compact)
end
if fionread
$defs << "-DFIONREAD_HEADER=\"<#{fionread}>\""
create_makefile(target)
end
else
if have_func("rb_w32_ioctlsocket", "ruby.h")
have_func("rb_w32_is_socket", "ruby.h")
create_makefile(target)
end
end
create_makefile("io/wait")

View File

@ -14,32 +14,6 @@
#include "ruby.h"
#include "ruby/io.h"
#include <sys/types.h>
#if defined(HAVE_UNISTD_H) && (defined(__sun))
#include <unistd.h>
#endif
#if defined(HAVE_SYS_IOCTL_H)
#include <sys/ioctl.h>
#endif
#if defined(FIONREAD_HEADER)
#include FIONREAD_HEADER
#endif
#ifdef HAVE_RB_W32_IOCTLSOCKET
#define ioctl ioctlsocket
#define ioctl_arg u_long
#define ioctl_arg2num(i) ULONG2NUM(i)
#else
#define ioctl_arg int
#define ioctl_arg2num(i) INT2NUM(i)
#endif
#ifdef HAVE_RB_W32_IS_SOCKET
#define FIONREAD_POSSIBLE_P(fd) rb_w32_is_socket(fd)
#else
#define FIONREAD_POSSIBLE_P(fd) ((void)(fd),Qtrue)
#endif
#ifndef HAVE_RB_IO_WAIT
static struct timeval *
get_timeout(int argc, VALUE *argv, struct timeval *timerec)
@ -66,41 +40,6 @@ wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
}
#endif
/*
* call-seq:
* io.nread -> int
*
* Returns number of bytes that can be read without blocking.
* Returns zero if no information available.
*
* You must require 'io/wait' to use this method.
*/
static VALUE
io_nread(VALUE io)
{
rb_io_t *fptr;
int len;
ioctl_arg n;
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "IO#nread is deprecated; use wait_readable instead");
GetOpenFile(io, fptr);
rb_io_check_char_readable(fptr);
len = rb_io_read_pending(fptr);
if (len > 0) return INT2FIX(len);
#ifdef HAVE_RB_IO_DESCRIPTOR
int fd = rb_io_descriptor(io);
#else
int fd = fptr->fd;
#endif
if (!FIONREAD_POSSIBLE_P(fd)) return INT2FIX(0);
if (ioctl(fd, FIONREAD, &n)) return INT2FIX(0);
if (n > 0) return ioctl_arg2num(n);
return INT2FIX(0);
}
#ifdef HAVE_RB_IO_WAIT
static VALUE
io_wait_event(VALUE io, int event, VALUE timeout, int return_io)
@ -125,36 +64,6 @@ io_wait_event(VALUE io, int event, VALUE timeout, int return_io)
}
#endif
/*
* call-seq:
* io.ready? -> truthy or falsy
*
* Returns a truthy value if input available without blocking, or a
* falsy value.
*
* You must require 'io/wait' to use this method.
*/
static VALUE
io_ready_p(VALUE io)
{
rb_io_t *fptr;
#ifndef HAVE_RB_IO_WAIT
struct timeval tv = {0, 0};
#endif
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "IO#ready? is deprecated; use wait_readable instead");
GetOpenFile(io, fptr);
rb_io_check_char_readable(fptr);
if (rb_io_read_pending(fptr)) return Qtrue;
#ifndef HAVE_RB_IO_WAIT
return wait_for_single_fd(fptr, RB_WAITFD_IN, &tv) ? Qtrue : Qfalse;
#else
return io_wait_event(io, RUBY_IO_READABLE, RB_INT2NUM(0), 1);
#endif
}
/* Ruby 3.2+ can define these methods. This macro indicates that case. */
#ifndef RUBY_IO_WAIT_METHODS
@ -424,9 +333,6 @@ Init_wait(void)
RB_EXT_RACTOR_SAFE(true);
#endif
rb_define_method(rb_cIO, "nread", io_nread, 0);
rb_define_method(rb_cIO, "ready?", io_ready_p, 0);
#ifndef RUBY_IO_WAIT_METHODS
rb_define_method(rb_cIO, "wait", io_wait, -1);

View File

@ -4,9 +4,6 @@ require 'test/unit'
require 'timeout'
require 'socket'
# For `IO#ready?` and `IO#nread`:
require 'io/wait'
class TestIOWait < Test::Unit::TestCase
def setup
@ -22,33 +19,6 @@ class TestIOWait < Test::Unit::TestCase
@w.close unless @w.closed?
end
def test_nread
assert_equal 0, @r.nread
@w.syswrite "."
sleep 0.1
assert_equal 1, @r.nread
end
def test_nread_buffered
@w.syswrite ".\n!"
assert_equal ".\n", @r.gets
assert_equal 1, @r.nread
end
def test_ready?
omit 'unstable on MinGW' if /mingw/ =~ RUBY_PLATFORM
assert_not_predicate @r, :ready?, "shouldn't ready, but ready"
@w.syswrite "."
sleep 0.1
assert_predicate @r, :ready?, "should ready, but not"
end
def test_buffered_ready?
@w.syswrite ".\n!"
assert_equal ".\n", @r.gets
assert_predicate @r, :ready?
end
def test_wait
omit 'unstable on MinGW' if /mingw/ =~ RUBY_PLATFORM
assert_nil @r.wait(0)

View File

@ -76,14 +76,6 @@ class TestIOWaitUncommon < Test::Unit::TestCase
check_dev(IO::NULL, :wait_writable)
end
def test_after_ungetc_ready?
check_dev(IO::NULL, mode: "r") {|fp|
assert_respond_to fp, :ready?
fp.ungetc(?a)
assert_predicate fp, :ready?
}
end
def test_after_ungetc_wait_readable
check_dev(IO::NULL, mode: "r") {|fp|
fp.ungetc(?a)
@ -91,13 +83,6 @@ class TestIOWaitUncommon < Test::Unit::TestCase
}
end
def test_after_ungetc_in_text_ready?
check_dev(IO::NULL, mode: "rt") {|fp|
fp.ungetc(?a)
assert_predicate fp, :ready?
}
end
def test_after_ungetc_in_text_wait_readable
check_dev(IO::NULL, mode: "rt") {|fp|
fp.ungetc(?a)