From: KIMURA Koichi Date: 2008-01-07T22:28:54+09:00 Subject: [ruby-dev:32974] Re: replica と alias の違い(encoding) 木村です。 まつもとさん、(う)さん、成瀬さんありがとうございます。 Yukihiro Matsumoto さんは書きました: > |・例外もしくはエラーが発生する > |・操作自体は通るけど何が起こるかわからない > | > |のどちらでしょうか? > > 操作自体は通ります。例外もエラーも起きません(Cですから)。 > ではなにが起きるかというと、元のエンコーディングも書き換わっ > てしまいます。別名ですから。 すみません。例によって言葉足らずでした。 構造体の構造も把握している人が直接いじればどうとでもできるというは 当然ですが、たとえば書き換え用のAPIを用意していて、それを経由する ときにはチェックされるとか云うことがあるかな。という前提でした。 #関数ポインタの類を自由に設定できるのは怖いかなと思ったのですが #少し考えてみればポインタを渡されてもその先にあるのが信用できる #関数かどうかは判断できませんよね。 U.Nakamura さんは書きました: > エンコーディングはRubyレベルではEncodingオブジェクトとして見 > えますが、実体はCレベルでのみ操作可能であり、replicaやaliasと > いうのもCレベルのAPIによる操作です。 > なのでたぶん質問の意図自体がずれているのではないかと思います。 はい。 上で書いたとおりのこちらの説明不足で、Cレベルの操作での話でした。 > で、各エンコーディングはCレベルの構造体と結びついているわけで > すが、aliasはオリジナルと同じ構造体インスタンスと結びついてお > り、一方replicaはオリジナルからコピーされた構造体インスタンス > と結びついています。 > したがって、aliasの関数を上書きするということはオリジナルの構 > 造体のメンバである関数エントリを置き換えるということになりま > す。 > Cレベルですからやろうと思えばなんでもできるわけですが、普通に > やれば、 > aliasの関数上書き == オリジナルの関数上書き > replicaの関数上書き == replicaの関数上書き > replicaのaliasの関数上書き == replicaの関数上書き > となります。 はい。 この上書きを防御する壁はあるのかという質問でした。 構造体を直接書き換えられてはどうしようもないと思いますが #ハッシュでも計算しておいて、構造体を参照するたびにチェックするとか? #重そう なんらかの関数経由だったらチェックしているのかなと。 すみません。まだソースの読みが足りませんでした。 NARUSE, Yui さんは書きました: >> かなあと思ったのですが、実際のコードを見ても自信がないので解説を >> していただけるとありがたいです。ここを見ろというポインタ指示でも >> かまいません(英語でかかれていても可です)。 > > わたしの発言ですと、[ruby-dev:32542] [ruby-dev:32885] あたりがまとまって > います。この用途で replica を用いようというのは [ruby-dev:32460] が初め > でしょうか。 ありがとうございます。 年末のメールだったので流し読みで済ませて内容が頭から抜け落ちていたようです。 > 端的にいえば、 > replica : 「encoding」を定義する > alias : 「encoding *名*」を定義する > ということになります。 > > 図にするとたぶん以下のような感じです。 詳細な説明ありがとうございます。 納得しました。 -- 木村浩一/KIMURA Koichi I thought what I'd do was, I'd pretend I was one of those deaf-mutes or shoud I? mail kbk at kt.rim.or.jp web www.kt.rim.or.jp/~kbk/zakkicho/index.html