Aaron Patterson 89d89fa49d When reading from stdin, put a wrapper around the IO object
The purpose of this commit is to fix Bug #21188.  We need to detect when
stdin has run in to an EOF case.  Unfortunately we can't _call_ the eof
function on IO because it will block.

Here is a short script to demonstrate the issue:

```ruby
x = STDIN.gets
puts x
puts x.eof?
```

If you run the script, then type some characters (but _NOT_ a newline),
then hit Ctrl-D twice, it will print the input string.  Unfortunately,
calling `eof?` will try to read from STDIN again causing us to need a
3rd Ctrl-D to exit the program.

Before introducing the EOF callback to Prism, the input loop looked
kind of like this:

```ruby
loop do
  str = STDIN.gets
  process(str)

  if str.nil?
    p :DONE
  end
end
```

Which required 3 Ctrl-D to exit.  If we naively changed it to something
like this:

```ruby
loop do
  str = STDIN.gets
  process(str)

  if STDIN.eof?
    p :DONE
  end
end
```

It would still require 3 Ctrl-D because `eof?` would block.  In this
patch, we're wrapping the IO object, checking the buffer for a newline
and length, and then using that to simulate a non-blocking eof? method.

This commit wraps STDIN and emulates a non-blocking `eof` function.

[Bug #21188]
2025-08-04 12:34:33 -07:00
..
2025-06-04 12:47:29 +09:00
2025-07-15 16:33:00 +00:00
2025-06-11 05:04:16 +00:00
2025-05-20 18:22:41 +09:00
2025-05-13 17:50:05 +00:00
2025-04-26 11:56:42 +00:00
2025-07-31 23:07:08 +09:00
2025-07-15 12:57:18 +02:00
2025-04-26 10:31:11 +09:00
2025-07-08 07:25:26 +00:00
2025-06-17 09:41:45 +00:00
2025-07-08 06:11:04 +00:00
2025-06-19 01:53:19 +00:00