なかだです。

At Tue, 29 Oct 2002 08:51:24 +0900,
Nobuyoshi-Nakada wrote:
> > |flushはとくに問題もないだろうと思って省略しました。どちらかとい
> > |うと問題なのはruby_eval()という投げやりな名前。
> > 
> > ruby_exec()とか? _runとの区別が大変か。
> 
> ruby_exec()も候補として考えてたので、それでいいかも知れません。
> 
> あともう一つ気なるのが、[ruby-dev:18582]のこの部分。forkしたス
> レッドが終了したときなんですが、こっちは単純にexit()でいいんで
> しょうか。かといって何かできるかというとなんにもなさそうなんで
> すが。

直接exit()するかわりに関数を登録しといてそれを呼ぶ、という手も
あるかも知れません。

もう一ヶ所、ruby_options()でもexit()していますが、これは不要?


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.344 diff -u -2 -p -r1.344 eval.c --- eval.c 25 Oct 2002 18:39:29 -0000 1.344 +++ eval.c 29 Oct 2002 00:16:49 -0000 @@ -1045,4 +1045,5 @@ error_print() } } + fflush(stderr); } @@ -1194,6 +1195,6 @@ error_handle(ex) } -void -ruby_options(argc, argv) +int +ruby_exec_options(argc, argv) int argc; char **argv; @@ -1209,7 +1210,17 @@ ruby_options(argc, argv) trace_func = 0; tracing = 0; - exit(error_handle(state)); + state = error_handle(state); } POP_TAG(); + return state; +} + +void +ruby_options(argc, argv) + int argc; + char **argv; +{ + int state = ruby_exec_options(argc, argv); + if (state) exit(state); } @@ -1230,6 +1241,6 @@ ruby_finalize() } -void -ruby_stop(ex) +int +ruby_cleanup(ex) int ex; { @@ -1252,16 +1263,13 @@ ruby_stop(ex) POP_TAG(); ruby_finalize(); - exit(ex); + return ex; } -void -ruby_run() +int +ruby_exec() { int state; - static int ex; volatile NODE *tmp; - if (ruby_nerrs > 0) exit(ruby_nerrs); - Init_stack((void*)&tmp); PUSH_TAG(PROT_NONE); @@ -1274,5 +1282,21 @@ ruby_run() POP_ITER(); POP_TAG(); + return state; +} + +void +ruby_stop(ex) + int ex; +{ + exit(ruby_cleanup(ex)); +} +void +ruby_run() +{ + int state; + static int ex; + if (ruby_nerrs > 0) exit(ruby_nerrs); + state = ruby_exec(); if (state && !ex) ex = state; ruby_stop(ex); @@ -3612,4 +3636,5 @@ rb_longjmp(tag, mesg) ruby_sourcefile, ruby_sourceline, RSTRING(e)->ptr); + fflush(stderr); } @@ -8121,4 +8146,5 @@ rb_thread_schedule() } END_FOREACH_FROM(curr, th); + fflush(stderr); next = main_thread; rb_thread_ready(next); Index: intern.h =================================================================== RCS file: /cvs/ruby/src/ruby/intern.h,v retrieving revision 1.98 diff -u -2 -p -r1.98 intern.h --- intern.h 23 Oct 2002 10:17:29 -0000 1.98 +++ intern.h 29 Oct 2002 00:17:15 -0000 @@ -174,4 +174,7 @@ void rb_exec_end_proc _((void)); void ruby_finalize _((void)); void ruby_stop _((int)); +int ruby_cleanup _((int)); +int ruby_exec _((void)); +int ruby_exec_options _((int, char **)); void rb_gc_mark_threads _((void)); void rb_thread_start_timer _((void));
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦