From: nobu.nakada@... Date: 2003-10-09T12:30:54+09:00 Subject: [ruby-dev:21558] Re: at_exist and safe level なかだです。 At Thu, 9 Oct 2003 12:12:55 +0900, Tanaka Akira wrote: > % ruby -ve '$SAFE = x = 1; at_exit { p $SAFE; p x }' > ruby 1.8.0 (2003-10-09) [i686-linux] > 0 > 1 > > というように、$SAFE == 1 な状態で at_exit で登録したものが $SAFE == 0 > な状態で動作するのは意図的でしょうか? まずいような気がしますねぇ。 * eval.c (rb_set_end_proc, rb_exec_end_proc): restore safe level. [ruby-dev:21557] Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.554 diff -u -2 -p -r1.554 eval.c --- eval.c 9 Oct 2003 01:51:08 -0000 1.554 +++ eval.c 9 Oct 2003 03:27:46 -0000 @@ -6407,4 +6407,5 @@ struct end_proc_data { void (*func)(); VALUE data; + int safe; struct end_proc_data *next; }; @@ -6425,4 +6426,5 @@ rb_set_end_proc(func, data) link->func = func; link->data = data; + link->safe = ruby_safe_level; *list = link; } @@ -6490,4 +6492,5 @@ rb_exec_end_proc() struct end_proc_data *link, *tmp; int status; + volatile int safe = ruby_safe_level; while (ephemeral_end_procs) { @@ -6497,4 +6500,5 @@ rb_exec_end_proc() PUSH_TAG(PROT_NONE); if ((status = EXEC_TAG()) == 0) { + ruby_safe_level = link->safe; (*link->func)(link->data); } @@ -6514,4 +6518,5 @@ rb_exec_end_proc() PUSH_TAG(PROT_NONE); if ((status = EXEC_TAG()) == 0) { + ruby_safe_level = link->safe; (*link->func)(link->data); } @@ -6525,4 +6530,5 @@ rb_exec_end_proc() } } + ruby_safe_level = safe; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦