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:
parent
c736714de1
commit
5b05b85d85
2 changed files with 40 additions and 20 deletions
|
@ -50,16 +50,18 @@ 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
|
||||
|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
|
||||
|
@ -79,16 +81,18 @@ module IRB # :nodoc:
|
|||
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue