From: nobu.nakada@... Date: 2004-06-19T13:03:05+09:00 Subject: [ruby-dev:23721] Re: define_method and $SAFE なかだです。 At Fri, 18 Jun 2004 08:01:24 +0900, Yukihiro Matsumoto wrote in [ruby-dev:23716]: > |外部の$SAFEを変更できなくなっていました。で、そのテストを作って > |いて気づいたんですが、メソッドを直接呼び出したときとMethod#call > |を使ったときでの振舞の違い、Methodオブジェクト内部での$SAFEの変 > |更は外部に影響しないというのは仕様でしょうか。 > > いや、仕様じゃないです。気がついてませんでした。 こんなとこでしょうか。ところでこれは1.8にも入れますか。 * eval.c (method_call): allow changing $SAFE. [ruby-dev:23713] Index: eval.c =================================================================== RCS file: /var/cvs/src/ruby/eval.c,v retrieving revision 1.670 diff -U2 -p -d -r1.670 eval.c --- eval.c 18 Jun 2004 14:52:06 -0000 1.670 +++ eval.c 19 Jun 2004 03:49:13 -0000 @@ -8725,5 +8725,5 @@ method_call(argc, argv, method) struct METHOD *data; int state; - volatile int safe = ruby_safe_level; + volatile int safe = -1; Data_Get_Struct(method, struct METHOD, data); @@ -8733,6 +8733,7 @@ method_call(argc, argv, method) PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT); PUSH_TAG(PROT_NONE); - if (OBJ_TAINTED(method) && ruby_safe_level < 4) { - ruby_safe_level = 4; + if (OBJ_TAINTED(method)) { + safe = ruby_safe_level; + if (ruby_safe_level < 4) ruby_safe_level = 4; } if ((state = EXEC_TAG()) == 0) { @@ -8741,5 +8742,5 @@ method_call(argc, argv, method) POP_TAG(); POP_ITER(); - ruby_safe_level = safe; + if (safe >= 0) ruby_safe_level = safe; if (state) JUMP_TAG(state); return result; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦