summaryrefslogtreecommitdiff
path: root/error.c
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 /error.c
parentc5fc4da7a22fa4125afc8b70876b3f7d52404001 (diff)
* 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
Diffstat (limited to 'error.c')
-rw-r--r--error.c40
1 files changed, 35 insertions, 5 deletions
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);