3

Luaから呼び出されたC関数内で、Lua呼び出しスタックをポップ/クリーンアップしたいと思います。これは可能ですか?

背景:
Cライブラリとその拡張スクリプトで同じテストフレームワークを使用したい。(Luaにはさまざまな単体テストツールが存在することを認識しています。気にしません。1つのレポートが必要です)CUnitをLuaの薄層でラップしています。CUnitは、致命的および非致命的なテストアサーションの選択肢を提供します。致命的なアサーションにより、すぐlongjmpにテストが終了し、フレームワークランナーに戻ります。これは、最初にスタックをクリーンアップしなかった場合、LuaVMに悪い影響を与えるようです。

スタックはおそらく次のようになります。

#0. C:   assert_wrapper_fcn(test, fatal)
#1. Lua: assert_fcn(bool)
#2. Lua: test_fcn()
#3. C:   runner(&test_fcn)

#0と#3の間のすべてをクリーンアップしたいと思います。test_fcn()とのメソッドシグネチャは知っていますassert_fcn(bool)が、それだけです。

4

3 に答える 3

8

スタックを空にするのは本当に簡単です。lua_settop引数として0を使用するだけです。

lua_settop(L, 0);
于 2012-11-15T20:36:40.447 に答える
2

質問を完全に理解しているのかわかりません...しかし、Luaのスタックをクリアするには:

int stackSize = lua_gettop(L);
lua_pop(L, stackSize);
于 2012-11-15T19:43:34.120 に答える
2

私の提案は、Lua独自のアサートシステムを使用し、それをランナーにトラップしてから、エラーを単体テストフレームワークに転送することです。

でLuaコードを起動しますlua_pcall

Luaコード内から、標準assertコマンドで致命的なエラーをトリガーします。

Luaコードを起動した場所から、結果を確認し、lua_pcall!= 0になったら、CUnitの致命的なアサーションの失敗をトリガーします。

これにより、LuaとCUnitの間にlongjmpが混在することを回避できます。

于 2012-11-16T14:40:43.160 に答える