From 2082417a48d56295796e2bbfc2001ecf5008a88a Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 18 May 2011 13:36:46 +0000 Subject: * eval.c (setup_exception): internal exception should be hidden git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31626 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ eval.c | 4 +++- eval_intern.h | 2 ++ test/ruby/test_signal.rb | 25 +++++++++++++++++++++++++ thread.c | 4 ++-- 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 56d019cfc6..2dc90ea706 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed May 18 22:36:43 2011 Nobuyoshi Nakada + + * eval.c (setup_exception): internal exception should be hidden + Wed May 18 20:25:04 2011 KOSAKI Motohiro * lib/timeout.rb (Timeout#timeout): don't leak "execution expired" diff --git a/eval.c b/eval.c index 2d07719e87..d5f2c4cc1d 100644 --- a/eval.c +++ b/eval.c @@ -371,8 +371,10 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg) const char *file; volatile int line = 0; - if (NIL_P(mesg)) + if (NIL_P(mesg)) { mesg = th->errinfo; + if (INTERNAL_EXCEPTION_P(mesg)) JUMP_TAG(TAG_FATAL); + } if (NIL_P(mesg)) { mesg = rb_exc_new(rb_eRuntimeError, 0, 0); } diff --git a/eval_intern.h b/eval_intern.h index cacaa6c311..e1316bfce7 100644 --- a/eval_intern.h +++ b/eval_intern.h @@ -135,6 +135,8 @@ NORETURN(void _longjmp(jmp_buf, int)); #define JUMP_TAG(st) TH_JUMP_TAG(GET_THREAD(), (st)) +#define INTERNAL_EXCEPTION_P(exc) FIXNUM_P(exc) + enum ruby_tag_type { RUBY_TAG_RETURN = 0x1, RUBY_TAG_BREAK = 0x2, diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb index 26e17b3b64..e3dd273fe1 100644 --- a/test/ruby/test_signal.rb +++ b/test/ruby/test_signal.rb @@ -1,5 +1,6 @@ require 'test/unit' require 'timeout' +require 'tempfile' require_relative 'envutil' class TestSignal < Test::Unit::TestCase @@ -195,4 +196,28 @@ class TestSignal < Test::Unit::TestCase w.close assert_equal(r.read, "foo") end + + def test_signal_requiring + t = Tempfile.new(%w"require_ensure_test .rb") + t.puts "sleep" + t.close + error = IO.popen([EnvUtil.rubybin, "-e", <special_exceptions[ruby_error_closed_stream] -- cgit v1.2.3