summaryrefslogtreecommitdiff
path: root/lib/irb
diff options
context:
space:
mode:
authorNobuhiro IMAI <nov@yo.rim.or.jp>2021-01-23 02:12:39 +0900
committergit <svn-admin@ruby-lang.org>2021-01-27 15:01:57 +0900
commit5b05b85d85002fd47eeb5e28f9f2898e99507b75 (patch)
treead7b6ac5a56938800b427bbbeb988aa5c7ab6b87 /lib/irb
parentc736714de11f9d8dd90cb5f4d6b39fd73054aabc (diff)
downloadruby-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.rb40
-rw-r--r--lib/irb/input-method.rb20
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