diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-22 00:38:19 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-22 00:38:19 +0000 |
commit | 4357f31d2525fabc5b3b2ef0fea7fdf0e519da56 (patch) | |
tree | 56390da116f5ad76371402113cdda910ada3adfb /eval.c | |
parent | ae2d632c66fa59c3ab8c425f4743faf11fe5e4bc (diff) |
* eval.c (ruby_cleanup): return EXIT_FAILURE if any exceptions occured
in at_exit blocks. [ruby-core:11263]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@13148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 31 |
1 files changed, 24 insertions, 7 deletions
@@ -1565,15 +1565,14 @@ ruby_cleanup(ex) int ex; { int state; - VALUE err; volatile VALUE errs[2]; int nerr; - errs[0] = ruby_errinfo; + errs[1] = ruby_errinfo; ruby_safe_level = 0; - Init_stack((void*)&state); + Init_stack((void *)&state); ruby_finalize_0(); - errs[1] = ruby_errinfo; + errs[0] = ruby_errinfo; PUSH_TAG(PROT_NONE); PUSH_ITER(ITER_NOT); if ((state = EXEC_TAG()) == 0) { @@ -1584,13 +1583,16 @@ ruby_cleanup(ex) ex = state; } POP_ITER(); - ruby_errinfo = errs[0]; + ruby_errinfo = errs[1]; ex = error_handle(ex); ruby_finalize_1(); POP_TAG(); - for (nerr = sizeof(errs) / sizeof(errs[0]); nerr;) { - if (!(err = errs[--nerr])) continue; + for (nerr = 0; nerr < sizeof(errs) / sizeof(errs[0]); ++nerr) { + VALUE err = errs[nerr]; + + if (!RTEST(err)) continue; + if (rb_obj_is_kind_of(err, rb_eSystemExit)) { return sysexit_status(err); } @@ -1598,7 +1600,22 @@ ruby_cleanup(ex) VALUE sig = rb_iv_get(err, "signo"); ruby_default_signal(NUM2INT(sig)); } + else if (ex == 0) { + ex = 1; + } + } + +#if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1 + switch (ex) { +#if EXIT_SUCCESS != 0 + case 0: return EXIT_SUCCESS; +#endif +#if EXIT_FAILURE != 1 + case 1: return EXIT_FAILURE; +#endif } +#endif + return ex; } |