mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 21:49:06 +02:00
![]() 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] |
||
---|---|---|
.. | ||
parse_result | ||
polyfill | ||
translation | ||
desugar_compiler.rb | ||
ffi.rb | ||
lex_compat.rb | ||
node_ext.rb | ||
pack.rb | ||
parse_result.rb | ||
pattern.rb | ||
prism.gemspec | ||
relocation.rb | ||
string_query.rb | ||
translation.rb |