=begin
ささだです.
Yukihiro Matsumoto wrote::
|以下のようにするとエラーメッセージの中に謎の-rが出てきます。
|
|% ruby-trunk -ve '$SAFE=4;open("")'
|ruby 1.9.1 (2008-12-14 revision 20736) [i686-linux]
|-e:1:in open': Insecure operation: -r (SecurityError) | from -e:1:in
'
|%
メソッド(open)の中でrb_check_safe_obj()が呼ばれてエラーになっ
た時、そのメソッドがトップレベルで呼ばれた場合、
rb_frame_callee()がNULLであるため、-rで発生したエラーと勘違
いするせいのようです。
rb_check_safe_obj()では、トップレベルで呼ばれたメソッドと、
実行環境が発生する前(-r)を区別する必要がありそうです。どうやっ
て区別できるのかちょっと調べてみますね。
そもそも,rb_frame_callee() が caller を見るのが良くないですね.
rb_f_method_name() の名前に引っ張られて,本来 rb_frame_caller() といった
名前にするところを rb_frame_callee() という名前にしているのが良くない.
というわけで,こんなパッチを書いてみましたがどうでしょうか.
Index: eval.c¶
--- eval.c (リビジョン 20968)
+++ eval.c (作業コピー)
@@ -750,6 +750,12 @@ rb_frame_this_func(void)
ID
rb_frame_callee(void)
{
- return frame_func_id(GET_THREAD()->cfp);
+}
-
+static ID
+rb_frame_caller(void)
+{
rb_thread_t *th = GET_THREAD();
rb_control_frame_t prev_cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
/ check if prev_cfp can be accessible */
@@ -1105,7 +1111,7 @@ rb_f_local_variables(void)
static VALUE
rb_f_method_name(void)
{
- ID fname = rb_frame_callee();
--
// SASADA Koichi at atdot dot net
=end