- 40 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:34:28 ]
- >>39
あー、なんかわかった。俺の理解はおかしかった >あと、メタメソッドは機構上、必ずインスタンスに張り付いてるそれが呼び出されるようで、 >メタメソッドを上書きしてから親クラスのそれをよびだそうとしても自分のそれが >呼び出されて無限ループになるって罠もあったり <はまった これ間違い メタメソッドは登録時に特殊処理されてて、クラスオブジェクト内の専用のテーブルに格納されてて、 メソッドとしてそもそも生えてない模様。 (class オブジェクトの _metamethods につっこまれてる) クラスオブジェクトにメソッドが生えてないから、当然インスタンス側にもコピーされてきてない。 インスタンスでのメタメソッド呼び出し処理は、VM内から直接クラスオブジェクト内の _metamethods を見に行ってる こんなかんじで呼び出そうとしてたんだけど(ちょっとうろおぼえコード) function _get(name) { if (自前処理) { return XXX; } else { // みつからないので親に投げる return Parent::_get(name); } } 1. Parent::_get はそもそも存在してない(メタメソッドなのでクラスにも生えてない) 2. Parent::hoge のようなクラスメソッド呼び出しは、VM側がコンテキストをすり替えて this コンテキストで呼び出し開始されてる 3. 存在してないから今のコンテキストの _get が "_get" を探すために呼び出し開始される 4. 無限ループ こんなオチではないかと そちらのほうだと、Point::_add() をよびだそうとした時点で同じことがおこってるんじゃないかな。たぶん。 その先がちょっとわからんのだけど、もしかしたら SqBind がさらにテーブルから検索して呼び出すとか そういう処理が入ってたりするのかな? どちらにしても大変気持ち悪いことになってるってことになるんじゃないかと…
|

|