[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

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

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30437] Re: fail to autoload at $SAFE==4

From: "Nobuyoshi Nakada" <nobu@...>
Date: 2007-02-27 06:02:33 UTC
List: ruby-dev #30437
なかだです。

At Tue, 27 Feb 2007 11:45:40 +0900,
Hidetoshi NAGAI wrote in [ruby-dev:30435]:
> > ということで考えたのが、以下の二つの案です。
> > (1) safe_levelを指定して探してくれるrb_provided()を追加する
> > (2) rb_provided()は拡張ライブラリについてはあきらめる

もう一つ考えました。

(3) autoloadを指定したときに実際にロードされるはずのライブラリを
    探し、.rbか.soか確定してしまう

> > rb_provided()はautoload関連でしか使われていないので、とりあえず
> > は(2)でいいのではないかと思います。拡張ライブラリだけロードされ
> > た時点では未定義の定数がdefined?やautoload?で真を返すようになり
> > ますが、実際に参照されればconst_missingになるので、許容範囲では
> > なかろうかと。
>
> 「(1) であれば autoload 定義時の $SAFE で呼べるので理想的ではあるが,
> 実装の効果と手間とを考えると...」という理解でいいでしょうか?
> よく分かってないのですが,(2) の仕様で「ギャッ」というケースは
> ないのでしょうか?

たとえば、foo.rbはないがFooだけを定義する拡張ライブラリfoo.soは
あるとすると、以下のコードはNameErrorになります。

  autoload :Bar, "foo"
  require "foo"
  Bar if defined?(Bar)

本来なら、もう"foo"としてロードできるものがないのだから、最後の
defined?(Bar)はnilになるはずです。もっとも、defined?とBarの参照
の間にfoo.rbが作られないという保証はない、と考えれば正しい動作か
もしれませんが。

今気づきましたが、動的にスクリプトを$LOAD_PATHに作るという可能性
を考えるなら、ロード済みの.soの有無をロード中の.rbの有無よりも優
先させてはまずいので、最後のif文はこうですね。

    if (rb_feature_p(feature, feature + strlen(feature), Qtrue))

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread