aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--eval.c24
2 files changed, 13 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index de79d76ede..f14700f7cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Jul 18 18:45:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (ruby_cleanup): error_handle() returns exit status to the
+ system, not internal error state, do not convert the exit status
+ again.
+
Sat Jul 18 10:29:03 2015 Eric Wong <e@80x24.org>
* test/ruby/test_process.rb: test thread+sigs work after failed exec
diff --git a/eval.c b/eval.c
index e50bc256ab..8c8ac947f6 100644
--- a/eval.c
+++ b/eval.c
@@ -164,6 +164,7 @@ ruby_cleanup(volatile int ex)
volatile VALUE errs[2];
rb_thread_t *th = GET_THREAD();
int nerr;
+ volatile int sysex = EXIT_SUCCESS;
rb_threadptr_interrupt(th);
rb_threadptr_check_signal(th);
@@ -195,22 +196,11 @@ ruby_cleanup(volatile int ex)
ex = state;
}
th->errinfo = errs[1];
- ex = error_handle(ex);
-
-#if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1
- switch (ex) {
-#if EXIT_SUCCESS != 0
- case 0: ex = EXIT_SUCCESS; break;
-#endif
-#if EXIT_FAILURE != 1
- case 1: ex = EXIT_FAILURE; break;
-#endif
- }
-#endif
+ sysex = error_handle(ex);
state = 0;
for (nerr = 0; nerr < numberof(errs); ++nerr) {
- VALUE err = errs[nerr];
+ VALUE err = ATOMIC_SIZE_EXCHANGE(errs[nerr], Qnil);
if (!RTEST(err)) continue;
@@ -218,7 +208,7 @@ ruby_cleanup(volatile int ex)
if (THROW_DATA_P(err)) continue;
if (rb_obj_is_kind_of(err, rb_eSystemExit)) {
- ex = sysexit_status(err);
+ sysex = sysexit_status(err);
break;
}
else if (rb_obj_is_kind_of(err, rb_eSignal)) {
@@ -226,8 +216,8 @@ ruby_cleanup(volatile int ex)
state = NUM2INT(sig);
break;
}
- else if (ex == EXIT_SUCCESS) {
- ex = EXIT_FAILURE;
+ else if (sysex == EXIT_SUCCESS) {
+ sysex = EXIT_FAILURE;
}
}
@@ -240,7 +230,7 @@ ruby_cleanup(volatile int ex)
ruby_vm_destruct(GET_VM());
if (state) ruby_default_signal(state);
- return ex;
+ return sysex;
}
static int