1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[ruby/irb] add IRB::FileInputMethod.open to ensure closing associated File

* tweak some methods not to raise exception after `#close`
* use it in `IRB::IrbLoader#{source_file,load_file}

https://github.com/ruby/irb/commit/ec2947acbd
This commit is contained in:
Nobuhiro IMAI 2021-01-23 02:12:39 +09:00 committed by git
parent c736714de1
commit 5b05b85d85
2 changed files with 40 additions and 20 deletions

View file

@ -50,7 +50,8 @@ module IRB # :nodoc:
# See Irb#suspend_input_method for more information.
def source_file(path)
irb.suspend_name(path, File.basename(path)) do
irb.suspend_input_method(FileInputMethod.new(path)) do
FileInputMethod.open(path) do |io|
irb.suspend_input_method(io) do
|back_io|
irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
@ -66,6 +67,7 @@ module IRB # :nodoc:
end
end
end
end
# Loads the given file in the current session's context and evaluates it.
#
@ -79,7 +81,8 @@ module IRB # :nodoc:
ws = WorkSpace.new
end
irb.suspend_workspace(ws) do
irb.suspend_input_method(FileInputMethod.new(path)) do
FileInputMethod.open(path) do |io|
irb.suspend_input_method(io) do
|back_io|
irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
@ -96,6 +99,7 @@ module IRB # :nodoc:
end
end
end
end
def old # :nodoc:
back_io = @io

View file

@ -124,10 +124,22 @@ module IRB
# Use a File for IO with irb, see InputMethod
class FileInputMethod < InputMethod
class << self
def open(file, &block)
begin
io = new(file)
block.call(io)
ensure
io&.close
end
end
end
# Creates a new input method object
def initialize(file)
super
@io = IRB::MagicFile.open(file)
@external_encoding = @io.external_encoding
end
# The file name of this input method, usually given during initialization.
attr_reader :file_name
@ -137,7 +149,7 @@ module IRB
#
# See IO#eof? for more information.
def eof?
@io.eof?
@io.closed? || @io.eof?
end
# Reads the next line from this input method.
@ -150,13 +162,17 @@ module IRB
# The external encoding for standard input.
def encoding
@io.external_encoding
@external_encoding
end
# For debug message
def inspect
'FileInputMethod'
end
def close
@io.close
end
end
begin