diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-12-11 01:48:21 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-12-11 01:48:21 +0000 |
commit | ea82d4809d6ad0cfcd0cfc351d1bc1f0fb92fe5c (patch) | |
tree | 87e14025c29af807e14725e8c2e21d86cf222ed2 | |
parent | c5fc4da7a22fa4125afc8b70876b3f7d52404001 (diff) | |
download | ruby-ea82d4809d6ad0cfcd0cfc351d1bc1f0fb92fe5c.tar.gz |
* error.c (exit_initialize): deal with true and false as well as
Kernel#exit. [ruby-dev:44951] [Bug #5728]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34008 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | error.c | 40 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 14 |
3 files changed, 54 insertions, 5 deletions
@@ -1,3 +1,8 @@ +Sun Dec 11 10:48:16 2011 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * error.c (exit_initialize): deal with true and false as well as + Kernel#exit. [ruby-dev:44951] [Bug #5728] + Sun Dec 11 10:37:47 2011 Nobuyoshi Nakada <nobu@ruby-lang.org> * object.c (rb_check_to_int): new function to convert a VALUE to @@ -749,16 +749,46 @@ exc_equal(VALUE exc, VALUE obj) * SystemExit.new(msg) -> system_exit * * Create a new +SystemExit+ exception with the given status and message. - * If status is not given, EXIT_SUCCESS is used. + * Status is true, false, or an integer. + * If status is not given, true is used. */ static VALUE exit_initialize(int argc, VALUE *argv, VALUE exc) { - VALUE status = INT2FIX(EXIT_SUCCESS); - if (argc > 0 && FIXNUM_P(argv[0])) { - status = *argv++; - --argc; + VALUE status; + if (argc > 0) { + status = *argv; + + switch (status) { + case Qtrue: + status = INT2FIX(EXIT_SUCCESS); + ++argv; + --argc; + break; + case Qfalse: + status = INT2FIX(EXIT_FAILURE); + ++argv; + --argc; + break; + default: + status = rb_check_to_int(status); + if (NIL_P(status)) { + status = INT2FIX(EXIT_SUCCESS); + } + else { +#if EXIT_SUCCESS != 0 + if (status == INT2FIX(0)) + status = INT2FIX(EXIT_SUCCESS); +#endif + ++argv; + --argc; + } + break; + } + } + else { + status = INT2FIX(EXIT_SUCCESS); } rb_call_super(argc, argv); rb_iv_set(exc, "status", status); diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index bb91c96285..b437405612 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -348,5 +348,19 @@ end.join eis = SystemExit.new(7, "msg") assert_equal(7, eis.status) assert_equal("msg", eis.message) + + bug5728 = '[ruby-dev:44951]' + et = SystemExit.new(true) + assert_equal(true, et.success?, bug5728) + assert_equal("SystemExit", et.message, bug5728) + ef = SystemExit.new(false) + assert_equal(false, ef.success?, bug5728) + assert_equal("SystemExit", ef.message, bug5728) + ets = SystemExit.new(true, "msg") + assert_equal(true, ets.success?, bug5728) + assert_equal("msg", ets.message, bug5728) + efs = SystemExit.new(false, "msg") + assert_equal(false, efs.success?, bug5728) + assert_equal("msg", efs.message, bug5728) end end |