From: nobu.nakada@... Date: 2003-10-09T14:07:40+09:00 Subject: [ruby-dev:21570] Re: at_exist and safe level なかだです。 At Thu, 9 Oct 2003 13:16:05 +0900, Yukihiro Matsumoto 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] > > コミットしてください。 その後考えたんですが、Procがsafe levelを3と4しか覚えてないとい うのがまずいような気もして来ました。ここでFL_USER3まで使ってし まうのは好ましくない? rb_set_end_proc()自体は拡張ライブラリからも呼べるので、これはこ れで必要かとは思いますが。 * eval.c (proc_save_safe_level, proc_get_safe_level, proc_set_safe_level): save/restore safe level 1..4. 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:46:23 -0000 @@ -6861,8 +6861,6 @@ rb_f_binding(self) } -#define PROC_T3 FL_USER1 -#define PROC_T4 FL_USER2 -#define PROC_TMAX (FL_USER1|FL_USER2) -#define PROC_TMASK (FL_USER1|FL_USER2) +#define PROC_TSHIFT (FL_USHIFT+1) +#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) static void @@ -6870,19 +6868,5 @@ proc_save_safe_level(data) VALUE data; { - if (OBJ_TAINTED(data)) { - switch (ruby_safe_level) { - case 3: - FL_SET(data, PROC_T3); - break; - case 4: - FL_SET(data, PROC_T4); - break; - default: - if (ruby_safe_level > 4) { - FL_SET(data, PROC_TMAX); - } - break; - } - } + FL_SET(data, (ruby_safe_level << PROC_TSHIFT) & PROC_TMASK); } @@ -6891,16 +6875,5 @@ proc_get_safe_level(data) VALUE data; { - if (OBJ_TAINTED(data)) { - switch (RBASIC(data)->flags & PROC_TMASK) { - case PROC_T3: - return 3; - case PROC_T4: - return 4; - case PROC_TMAX: - return 5; - } - return 3; - } - return 0; + return (RBASIC(data)->flags & PROC_TMASK) >> PROC_TSHIFT; } @@ -6909,7 +6882,5 @@ proc_set_safe_level(data) VALUE data; { - if (OBJ_TAINTED(data)) { - ruby_safe_level = proc_get_safe_level(data); - } + ruby_safe_level = proc_get_safe_level(data); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦