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 /error.c | |
parent | c5fc4da7a22fa4125afc8b70876b3f7d52404001 (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.c | 40 |
1 files changed, 35 insertions, 5 deletions
@@ -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); |