diff options
author | Nobuhiro IMAI <nov@yo.rim.or.jp> | 2021-01-23 02:12:39 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2021-01-27 15:01:57 +0900 |
commit | 5b05b85d85002fd47eeb5e28f9f2898e99507b75 (patch) | |
tree | ad7b6ac5a56938800b427bbbeb988aa5c7ab6b87 /lib/irb | |
parent | c736714de11f9d8dd90cb5f4d6b39fd73054aabc (diff) | |
download | ruby-5b05b85d85002fd47eeb5e28f9f2898e99507b75.tar.gz |
[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
Diffstat (limited to 'lib/irb')
-rw-r--r-- | lib/irb/ext/loader.rb | 40 | ||||
-rw-r--r-- | lib/irb/input-method.rb | 20 |
2 files changed, 40 insertions, 20 deletions
diff --git a/lib/irb/ext/loader.rb b/lib/irb/ext/loader.rb index 1b683d88e5..5a198bbef5 100644 --- a/lib/irb/ext/loader.rb +++ b/lib/irb/ext/loader.rb @@ -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 diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index 61540a106f..e223672985 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -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 |