eval.c: extra conversion of exit status
* eval.c (ruby_cleanup): error_handle() returns exit status to the system, not internal error state, do not convert the exit status again. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3661dae19c
commit
ca5cfbe1ab
@ -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>
|
Sat Jul 18 10:29:03 2015 Eric Wong <e@80x24.org>
|
||||||
|
|
||||||
* test/ruby/test_process.rb: test thread+sigs work after failed exec
|
* test/ruby/test_process.rb: test thread+sigs work after failed exec
|
||||||
|
24
eval.c
24
eval.c
@ -164,6 +164,7 @@ ruby_cleanup(volatile int ex)
|
|||||||
volatile VALUE errs[2];
|
volatile VALUE errs[2];
|
||||||
rb_thread_t *th = GET_THREAD();
|
rb_thread_t *th = GET_THREAD();
|
||||||
int nerr;
|
int nerr;
|
||||||
|
volatile int sysex = EXIT_SUCCESS;
|
||||||
|
|
||||||
rb_threadptr_interrupt(th);
|
rb_threadptr_interrupt(th);
|
||||||
rb_threadptr_check_signal(th);
|
rb_threadptr_check_signal(th);
|
||||||
@ -195,22 +196,11 @@ ruby_cleanup(volatile int ex)
|
|||||||
ex = state;
|
ex = state;
|
||||||
}
|
}
|
||||||
th->errinfo = errs[1];
|
th->errinfo = errs[1];
|
||||||
ex = error_handle(ex);
|
sysex = 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
|
|
||||||
|
|
||||||
state = 0;
|
state = 0;
|
||||||
for (nerr = 0; nerr < numberof(errs); ++nerr) {
|
for (nerr = 0; nerr < numberof(errs); ++nerr) {
|
||||||
VALUE err = errs[nerr];
|
VALUE err = ATOMIC_SIZE_EXCHANGE(errs[nerr], Qnil);
|
||||||
|
|
||||||
if (!RTEST(err)) continue;
|
if (!RTEST(err)) continue;
|
||||||
|
|
||||||
@ -218,7 +208,7 @@ ruby_cleanup(volatile int ex)
|
|||||||
if (THROW_DATA_P(err)) continue;
|
if (THROW_DATA_P(err)) continue;
|
||||||
|
|
||||||
if (rb_obj_is_kind_of(err, rb_eSystemExit)) {
|
if (rb_obj_is_kind_of(err, rb_eSystemExit)) {
|
||||||
ex = sysexit_status(err);
|
sysex = sysexit_status(err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (rb_obj_is_kind_of(err, rb_eSignal)) {
|
else if (rb_obj_is_kind_of(err, rb_eSignal)) {
|
||||||
@ -226,8 +216,8 @@ ruby_cleanup(volatile int ex)
|
|||||||
state = NUM2INT(sig);
|
state = NUM2INT(sig);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (ex == EXIT_SUCCESS) {
|
else if (sysex == EXIT_SUCCESS) {
|
||||||
ex = EXIT_FAILURE;
|
sysex = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +230,7 @@ ruby_cleanup(volatile int ex)
|
|||||||
ruby_vm_destruct(GET_VM());
|
ruby_vm_destruct(GET_VM());
|
||||||
if (state) ruby_default_signal(state);
|
if (state) ruby_default_signal(state);
|
||||||
|
|
||||||
return ex;
|
return sysex;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user