mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
irb.rb: restore the last error
* lib/irb.rb (eval_input): restore the last error `$!`, as the previous result. [Feature #14684] * lib/irb/context.rb (evaluate): add `exception` keyword argument to set the last error. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63150 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d6dc676d07
commit
9fa0d0058d
3 changed files with 18 additions and 2 deletions
|
@ -439,6 +439,8 @@ module IRB
|
|||
|
||||
# Evaluates input for this session.
|
||||
def eval_input
|
||||
last_error = nil
|
||||
|
||||
@scanner.set_prompt do
|
||||
|ltype, indent, continue, line_no|
|
||||
if ltype
|
||||
|
@ -488,7 +490,7 @@ module IRB
|
|||
signal_status(:IN_EVAL) do
|
||||
begin
|
||||
line.untaint
|
||||
@context.evaluate(line, line_no)
|
||||
@context.evaluate(line, line_no, exception: last_error)
|
||||
output_value if @context.echo?
|
||||
exc = nil
|
||||
rescue Interrupt => exc
|
||||
|
@ -497,6 +499,7 @@ module IRB
|
|||
rescue Exception => exc
|
||||
end
|
||||
if exc
|
||||
last_error = exc
|
||||
handle_exception(exc)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -376,8 +376,12 @@ module IRB
|
|||
@debug_level > 0
|
||||
end
|
||||
|
||||
def evaluate(line, line_no) # :nodoc:
|
||||
def evaluate(line, line_no, exception: nil) # :nodoc:
|
||||
@line_no = line_no
|
||||
if exception
|
||||
line = "begin ::Kernel.raise _; rescue _.class; #{line}; end"
|
||||
@workspace.local_variable_set(:_, exception)
|
||||
end
|
||||
set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
|
||||
end
|
||||
|
||||
|
|
|
@ -40,5 +40,14 @@ module TestIRB
|
|||
assert_same(obj, @context.last_value)
|
||||
assert_same(obj, @context.evaluate('_', 1))
|
||||
end
|
||||
|
||||
def test_evaluate_with_exception
|
||||
assert_nil(@context.evaluate("$!", 1))
|
||||
e = assert_raise_with_message(RuntimeError, 'foo') {
|
||||
@context.evaluate("raise 'foo'", 1)
|
||||
}
|
||||
assert_equal('foo', e.message)
|
||||
assert_same(e, @context.evaluate('$!', 1, exception: e))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue