lua c api を使用して、グローバル名前空間とそのすべてのコンテンツをクロールしようとしています。私が直面している問題の 1 つは、表での自己参照です。エントリが存在するかどうかを判断するために平坦化されたテーブル アプローチを使用していましたが、次のようなネストされた数値テーブルでは失敗します。
a = {[1] = {[1]={[1]=true}}}
1 のキー名は、複数回発生するため、重複エントリを false トリガーします。これを回避するために、 lua_topointer を使用して参照をマッピングに保存し、これを次のようにチェックするというアプローチを採用しました (varUnit は、ロードされた変数を追跡するための単なる構造です)。
lua_pushvalue(L, -1);
const void* kp = lua_topointer(L, -1);
var->kpointer = kp;
varUnit->addPointer(kp);
lua_pop(L, 1);
lua_pushvalue(L, -2);
const void* vp = lua_topointer(L, -1);
var->vpointer = vp;
varUnit->addPointer(vp);
lua_pop(L, 1);
次に、その変数が存在するかどうかを後で確認し、存在する場合は、テーブルを下るのをやめます。ただし、これは、自己参照テーブルを処理する際の無限再帰を停止していません。ここでより良いアプローチ/いくつかの欠陥のあるロジックはありますか? 特定のテーブルに 2 度目に遭遇すると、別のポインターが表示されますか? テーブルをクロールする複数の lua ベースの方法を見てきましたが、c ベースではありません。
編集:閉じられた質問は、ポインターを変数に割り当てる前に、ポインターが重複していることを確認していたばかげた間違いでした。