From: nobu.nakada@... Date: 2003-10-06T14:07:02+09:00 Subject: [ruby-dev:21514] Re: eval BEGIN/END at runtime なかだです。 At Mon, 6 Oct 2003 13:16:43 +0900, Koji Arai wrote: > 思い出しついでにENDのネストが二重までしか許さないのは意図的 > でしょうか? こっちはバグだろうと思いますが。 > ネストした END が最後に回されるのも仕様でしょうか? > なんとなく、35421 を期待したのですがそうじゃないとしても > 別に困りませんが。 これはどっちでしょうねぇ。 > 今試してみたら perl(5.8.0) は 35421 ですね。 合わせるんならこんなとこでしょうか。ephemeral_end_procsはperlと 同じ順序なんですよね。 * eval.c (rb_exec_end_proc): allow nested END statements. [ruby-dev:21513] * eval.c (rb_exec_end_proc): executet nested END statements first. Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.550 diff -u -2 -p -r1.550 eval.c --- eval.c 6 Oct 2003 01:50:37 -0000 1.550 +++ eval.c 6 Oct 2003 04:54:59 -0000 @@ -6481,37 +6481,14 @@ rb_f_at_exit() } -void -rb_exec_end_proc() +static void +exec_end_proc(procs) + struct end_proc_data **procs; { - struct end_proc_data *link, *save; + struct end_proc_data *link; int status; - save = link = end_procs; - while (link) { - PUSH_TAG(PROT_NONE); - if ((status = EXEC_TAG()) == 0) { - (*link->func)(link->data); - } - POP_TAG(); - if (status) { - error_handle(status); - } - link = link->next; - } - link = end_procs; - while (link != save) { - PUSH_TAG(PROT_NONE); - if ((status = EXEC_TAG()) == 0) { - (*link->func)(link->data); - } - POP_TAG(); - if (status) { - error_handle(status); - } - link = link->next; - } - while (ephemeral_end_procs) { - link = ephemeral_end_procs; - ephemeral_end_procs = link->next; + while (*procs) { + link = *procs; + *procs = link->next; PUSH_TAG(PROT_NONE); if ((status = EXEC_TAG()) == 0) { @@ -6524,4 +6501,11 @@ rb_exec_end_proc() free(link); } +} + +void +rb_exec_end_proc() +{ + exec_end_proc(&end_procs); + exec_end_proc(&ephemeral_end_procs); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦