2008年2月11日月曜日

Lua 再び、その後 or 続き

昨日のやつ解決しました。

Lua を実行したとき、その Lua から逆に呼び出し元にあたるクラスの
メンバ関数をコールしているところでこけていたようです。

Lua からコールされる関数は、アクセッサみたいなものなんですが
Lua にアタッチするために static になっていて、当然メンバ変数に
アクセスできません。

そこで "C++ → Lua" でコールするとき this を渡し、"Lua → C++"
でコールすときにはさっきの this を渡すようにしています。ただし
Lua はクラスの型なんか感知しないので void* に変換されます。

なので、static なアクセッサはキャストを行います。

MyObj::func_for_lua( void* sender)
{
    MyObj* self = (MyObj*)sender;
    return m_Number;
}


…で、ながーい前置きのあと話を昨日に戻すと

子オブジェクトは機能的にはサブセットになっていて、
生成元のスーパークラスです。けど共有する Lua ステートには、既に
サブクラスのメンバ関数がアタッチされている訳です。

そりゃまあ、何が起きてもおかしくありません。
という訳でクラス設計がまずかったようです。
そんな大げさに手を入れずに綺麗に収まりそうなのを確認して
今日は帰ってきました。

Lua 再び

世間じゃ連休だっていうのに仕事しています。

あるキャラクターに従属する子オブジェクトを生成するとき
ステートを司る Lua スクリプトを共有するようにしました。

…が、その子オブジェクトを破棄するときに落ちます。
エラーメッセージは「ヒープが壊れている」云々という無愛想な
もので原因を探すのに手間取っています。

ちゃんと "lua_newthread"でスタック(Luaが独自に提供するもので
一般的な C のスタックではない)を確保しているんですけどねえ。

全く同じキャラクターが同じ場面に登場したときも、同じ仕組みで
リソース共有してるんですがこちらは問題なし。謎だ。