なかだです。

At Sun, 7 Apr 2002 04:21:17 +0900,
takuma ozawa wrote:
> 以下のスクリプトがSegfaultしました。
> 
> while true
>   t = Thread.start {
>     a
>   }
>   t.abort_on_exception = true
> end

単にraise SystemExitでも落ちますね。

* ruby_options(), ruby_stop()でerror_handle()までPROT_NONEでガー
  ド。

* 内部的に投げるSystemExitは@statusをセット。

* @statusがセットされていないときは0とみなす。


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.278 diff -u -2 -p -r1.278 eval.c --- eval.c 2002/03/26 06:18:49 1.278 +++ eval.c 2002/04/07 19:23:21 @@ -1130,5 +1130,5 @@ error_handle(ex) if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { VALUE st = rb_iv_get(ruby_errinfo, "status"); - ex = NUM2INT(st); + ex = NIL_P(st) ? 0 : NUM2INT(st); } else { @@ -1155,5 +1155,4 @@ ruby_options(argc, argv) ruby_process_options(argc, argv); } - POP_TAG(); if (state) { trace_func = 0; @@ -1161,4 +1160,5 @@ ruby_options(argc, argv) exit(error_handle(state)); } + POP_TAG(); } @@ -1195,9 +1195,9 @@ ruby_stop(ex) } POP_ITER(); - POP_TAG(); trace_func = 0; tracing = 0; ex = error_handle(ex); + POP_TAG(); ruby_finalize(); exit(ex); @@ -3453,7 +3453,6 @@ rb_mod_method_defined(mod, mid) } -NORETURN(static void terminate_process _((int, const char*, int))); -static void -terminate_process(status, mesg, mlen) +static VALUE +rb_sysexit_new(status, mesg, mlen) int status; const char *mesg; @@ -3463,7 +3462,9 @@ terminate_process(status, mesg, mlen) rb_iv_set(exit, "status", INT2NUM(status)); - rb_exc_raise(exit); + return exit; } +#define terminate_process(status, mesg, mlen) rb_exc_raise(rb_sysexit_new(status, mesg, mlen)) + void rb_exit(status) @@ -8530,5 +8531,5 @@ rb_thread_start_0(fn, arg, th_arg) } else if (th->safe < 4 && (thread_abort || th->abort || RTEST(ruby_debug))) { - VALUE err = rb_exc_new(rb_eSystemExit, 0, 0); + VALUE err = rb_sysexit_new(1, 0, 0); error_print(); /* exit on main_thread */
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦