Skip to content

Commit

Permalink
add IRB::FileInputMethod.open to ensure closing associated File
Browse files Browse the repository at this point in the history
* tweak some methods not to raise exception after `#close`
* use it in `IRB::IrbLoader#{source_file,load_file}
  • Loading branch information
no6v committed Jan 22, 2021
1 parent fc3e1d9 commit ec2947a
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 20 deletions.
40 changes: 22 additions & 18 deletions lib/irb/ext/loader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,18 @@ def search_file_from_ruby_path(fn) # :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
|back_io|
irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
irb.eval_input
else
begin
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)
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
else
begin
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
end
Expand All @@ -79,16 +81,18 @@ def load_file(path, priv = nil)
ws = WorkSpace.new
end
irb.suspend_workspace(ws) do
irb.suspend_input_method(FileInputMethod.new(path)) do
|back_io|
irb.signal_status(:IN_LOAD) do
if back_io.kind_of?(FileInputMethod)
irb.eval_input
else
begin
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)
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
else
begin
irb.eval_input
rescue LoadAbort
print "load abort!!\n"
end
end
end
end
Expand Down
20 changes: 18 additions & 2 deletions lib/irb/input-method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,22 @@ def inspect

# 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
Expand All @@ -137,7 +149,7 @@ def initialize(file)
#
# See IO#eof? for more information.
def eof?
@io.eof?
@io.closed? || @io.eof?
end

# Reads the next line from this input method.
Expand All @@ -150,13 +162,17 @@ def gets

# 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
Expand Down

0 comments on commit ec2947a

Please sign in to comment.