aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c3
-rw-r--r--test/ruby/test_exception.rb17
2 files changed, 19 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 94177e1d79..24d9b39774 100644
--- a/eval.c
+++ b/eval.c
@@ -121,6 +121,7 @@ ruby_options(int argc, char **argv)
else {
rb_ec_clear_current_thread_trace_func(ec);
state = error_handle(ec, state);
+ ec->errinfo = Qnil; /* just been handled */
iseq = (void *)INT2FIX(state);
}
EC_POP_TAG();
@@ -317,7 +318,7 @@ ruby_run_node(void *n)
rb_execution_context_t *ec = GET_EC();
int status;
if (!ruby_executable_node(n, &status)) {
- rb_ec_cleanup(ec, 0);
+ rb_ec_cleanup(ec, (NIL_P(ec->errinfo) ? TAG_NONE : TAG_RAISE));
return status;
}
ruby_init_stack((void *)&status);
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index b87cef3fb6..3a2aeeab80 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -1457,4 +1457,21 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status|
assert_match("BOO!", e.full_message.lines.first)
assert_equal({ highlight: Exception.to_tty? }, opt_)
end
+
+ def test_syntax_error_detailed_message
+ Tempfile.create(%w[detail .rb]) do |lib|
+ lib.print "#{<<~"begin;"}\n#{<<~'end;'}"
+ begin;
+ class SyntaxError
+ def detailed_message(**)
+ Thread.start {}.join
+ "#{super}\n""<#{File.basename(__FILE__)}>"
+ end
+ end
+ end;
+ lib.close
+ pattern = /^<#{Regexp.quote(File.basename(lib.path))}>/
+ assert_in_out_err(%W[-r#{lib.path} -], "1+", [], pattern)
+ end
+ end
end