From: nobu.nakada@... Date: 2004-06-17T13:42:04+09:00 Subject: [ruby-dev:23706] Re: define_method and $SAFE なかだです。 At Thu, 17 Jun 2004 13:16:01 +0900, Yukihiro Matsumoto wrote in [ruby-dev:23705]: > |http://nokada.jin.gr.jp/t/20040611.html#p03 で書いた話ですが、 > |define_methodでは呼び出されたときの$SAFEを使うようにするパッチ > |です。いまいちすっきりしませんが。 > > 基本的にはこれでいいんじゃないでしょうか。私自身はPROC_TMASK > のところに「$SAFEを保存しないフラグ」を用意する方法を考えて > いましたが。 こういう感じ? 最初元のProcにも影響しちゃうんじゃないかと思って [ruby-dev:23697]のようにしたんですが、cloneしてましたね。こっち のがシンプルでよさそう。 Index: eval.c =================================================================== RCS file: /var/cvs/src/ruby/eval.c,v retrieving revision 1.668 diff -U2 -p -d -r1.668 eval.c --- eval.c 16 Jun 2004 14:21:33 -0000 1.668 +++ eval.c 17 Jun 2004 04:38:19 -0000 @@ -7877,4 +7877,5 @@ rb_f_binding(self) #define PROC_TSHIFT (FL_USHIFT+1) #define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) +#define PROC_NOSAFE FL_USER4 static void @@ -7896,4 +7897,5 @@ proc_set_safe_level(data) VALUE data; { + if (RBASIC(data)->flags & PROC_NOSAFE) return; ruby_safe_level = proc_get_safe_level(data); } @@ -9142,4 +9144,5 @@ rb_mod_define_method(argc, argv, mod) body = proc_clone(body); + RBASIC(body)->flags |= PROC_NOSAFE; Data_Get_Struct(body, struct BLOCK, block); block->frame.last_func = id; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦