From: Yusuke Endoh Date: 2009-11-15T03:50:38+09:00 Subject: [ruby-dev:39689] [Feature #2366] private constant チケット #2366 が更新されました。 (by Yusuke Endoh) ファイル const_tbl.patch 追加 ファイル const_entry.patch 追加 ファイル private_constant.patch 追加 遠藤です。 > なるほど、良いアイディアだと思います。採用するタイミングは > Yuguiさんに訊いてみないといけませんが、いずれ採用したいと思い > ます。 ありがとうございます。 ささださんと話して、もうちょっとちゃんとした実装を作りました。 結構巨大な変更になったので、3 段階のパッチに分けました。 1. const_tbl.patch: クラスの持つ定数やクラス変数やその他をごちゃまぜに管理している RCLASS_IV_TBL から、定数だけを管理する RCLASS_CONST_TBL を切り 出す。 2. const_entry.patch RCLASS_CONST_TBL のエントリが定数の直接値を指していたところを、 rb_const_entry_t をはさんで間接的に指すようにする。 rb_const_entry_t には visibility のフラグを持たせる。 rb_const_entry_t は malloc で管理される。 3. private_constant.patch Module#public_constant と private_constant を定義し、private constant の参照で例外を投げる。 make test-all でエラーが増えることはないようです。 > Yuguiさんはどう思いますか? どうでしょうか。 API を練る必要がありそう (Module#constants に引数持たせるかとか Module#private_constants を作るかとか) なので、無理に 1.9.2 に 入れなくてもいいと思いますが、定数テーブルの切り出しが地味に大変 だった (1 のパッチ) ので、これだけ入れておくと後で楽そうです。 しかし、ここまで書いてから気がつきましたが、もし rb_classext_t や RCLASS_IV_TBL が公開 API だったら、このパッチはバイナリ互換性を 壊すことになりそうです。関数レベルでの互換性は変わらない (はず) ですが。 -- Yusuke Endoh ---------------------------------------- http://redmine.ruby-lang.org/issues/show/2366 ---------------------------------------- http://redmine.ruby-lang.org