[#21338] $SAFE=4 での autoload — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

21 messages 2003/09/04
[#21346] Re: $SAFE=4 での autoload — nobu.nakada@... 2003/09/04

なかだです。

[#21359] Re: $SAFE=4 での autoload — Hidetoshi NAGAI <nagai@...> 2003/09/05

永井@知能.九工大です.

[#21419] Makefile.inのlex.c — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

15 messages 2003/09/28

[ruby-dev:21359] Re: $SAFE=4 での autoload

From: Hidetoshi NAGAI <nagai@...>
Date: 2003-09-05 16:22:02 UTC
List: ruby-dev #21359
永井@知能.九工大です.

From: nobu.nakada@nifty.ne.jp
Subject: [ruby-dev:21346] Re: $SAFE=4 での autoload
Date: Thu, 4 Sep 2003 23:34:31 +0900
Message-ID: <200309041434.h84EYVRG018001@sharui.nakada.kanuma.tochigi.jp>
> そうすると、requireはautoloadを呼び出したときの$SAFEで実行すべ
> きでしょうか。もしそうだとすれば、今はすでにautoloadされている
> 定数をさらにautoloadしようとしても何も変わりませんが、違う$SAFE
> で呼ばれたときにはどっちを優先すべきなんでしょう。

autoload を呼んで対応付けをしたときの $SAFE とすべきではないかと
思うのですが,何かまずいでしょうか.
autoload は「ここで require してもいいんだけど,それに含まれる機能を
使わないのならば読み込まなくても問題がないので,資源節約のためにも
必要だと言われるときまで読み込みは保留しましょう」というものだと
解釈しています.
ですので,最後に autoload の対応付けがなされた時点での $SAFE で良いと
考えます.

また,別メールの件になりますが,

From: matz@ruby-lang.org (Yukihiro Matsumoto)
Subject: [ruby-dev:21347] Re: $SAFE=4 での autoload
Date: Fri, 5 Sep 2003 00:16:41 +0900
Message-ID: <1062688599.143258.32475.nullmailer@picachu.netlab.jp>
> 以前、requireは$SAFE=1で実行すれば良いのだと思ったことを記憶
> しています。で、実際にそうしてたつもりなんですが、autoloadで
> は動いてなかったということなんでしょうか。

については,
---< hoge.rb >-----------
p $SAFE
-------------------------
としたとき,
-------------------------
require 'hoge.rb'
-------------------------
も
-------------------------
$SAFE = 2
require 'hoge.rb'
-------------------------
も
-------------------------
file = 'hoge.rb'
$SAFE = 3
require file
-------------------------
も,すべて 0 が出力されますから,
$SAFE=0 で実行されているように見えます.

# ruby 1.8.0 (2003-09-05) [i686-linux] での結果です.

で,話は変わりますが,

> @@ -6068,4 +6081,16 @@ rb_require(fname)
>  }
>  
> +VALUE
> +rb_require_autoload(file, klass, id)
> +    VALUE file, klass;
> +    ID id;
> +{
> +    PUSH_FRAME();
> +    ruby_frame->last_class = klass;
> +    ruby_frame->last_func = id;
> +    rb_f_require(Qnil, file);
> +    POP_FRAME();
> +}
> +
>  static void
>  secure_visibility(self)

これの
---------------------------------------
> +    ruby_frame->last_func = id;
---------------------------------------
の部分ですが,
---------------------------------------
    ruby_frame->last_func = rb_to_id(rb_str_plus(rb_str_new2("(autoload):"), 
						 rb_str_new2(rb_id2name(id))));
---------------------------------------
とするのはどうでしょうか.
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread