aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-11 01:48:21 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-11 01:48:21 +0000
commitea82d4809d6ad0cfcd0cfc351d1bc1f0fb92fe5c (patch)
tree87e14025c29af807e14725e8c2e21d86cf222ed2
parentc5fc4da7a22fa4125afc8b70876b3f7d52404001 (diff)
downloadruby-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--ChangeLog5
-rw-r--r--error.c40
-rw-r--r--test/ruby/test_exception.rb14
3 files changed, 54 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 262b030567..beeede5995 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/error.c b/error.c
index e2e36cec79..3ea090fe83 100644
--- a/error.c
+++ b/error.c
@@ -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