怪奇現象(いわゆる「よくある話」
ついカッとなってつらつらと症状を書き連ねてしまいましたが、最小構成のコードで試してみたところなんら問題がなかったので改めて検証中。
どこかで自分が変なことやらかしてる可能性しかないのですが…うーむ…
調べてみた。はいはい、ですよねー
// こっちは動かないコード。 // lua_getfield(rootState,LUA_GLOBALSINDEX,"func1"); // lua_xmove(rootState,threadState,1); // lua_pop(rootState,1);
lua_xmoveの時点で関数はスタックから取り除かれてるじゃんmoveであってcopyじゃねぇようあああん
教訓:カッとなってブログ記事書くな
というわけで以下の内容含めこのエントリはいつにも増してゴミですが自戒のために消さないでおきましょう。
lua_State* threadState = lua_newthread(rootState); // こっちは動かないコード。 // lua_getfield(rootState,LUA_GLOBALSINDEX,"func1"); // lua_xmove(rootState,threadState,1); // lua_pop(rootState,1); // こっちは動くコード lua_getfield(threadState,LUA_GLOBALSINDEX,"func1"); System::Diagnostics::Debug::WriteLine ("stack top type :" + lua_type(threadState,-1));
動かないほうのコードがここに書いた分だけでは回りくどいだけで意味がありませんが、全体の流れからいってこんな処理をやりたくなったのですよ。
最初にrootStateのスタックトップに関数を積んだ後、rootStateのスタックトップからthreadStateのスタックトップへコピーしています。
それで実行結果なのですが、動くほうのコードはごく普通です。
lua_dofile(rootState,<関数func1を定義しているLuaファイル>);
を事前に実行していればスタックトップに関数func1が積まれ
stack top type :6
(6 = LUA_TFUNCTION :関数オフジェクト)というデバック出力が常に得られます。
動かないほうのコードはへんなことが発生します。
lua_dofile(rootState,<関数func1を定義しているLuaファイル>);
がrootStateに対する最初のdofileだったときに限り上記のコードは正常に実行され動くほうのコードと同じ出力が得られます。
ところが、
lua_dofile(rootState,<関数func0を定義しているLuaファイル>); lua_dofile(rootState,<関数func1を定義しているLuaファイル>);
というように、関数func1の定義がrootStateに対する2回目以降のdofileで行われた場合は
stack top type :0
(0 = LUA_TNIL :nil値)つまり関数func1が見つからんということになります。
これが
lua_dofile(rootState,<関数func0とfunc1を定義しているLuaファイル>);
であった場合はちゃんと動くのですが…
仕方ないので今は対処療法的なコードで何とかしておくか