function型を関数名に変換する
Luaのgetinfoでそのスタックの関数名を引けるのですが、どうしてもc側から呼ばれた関数のスタックについては関数名にnilが返され、取得できません。
まぁ、それぐらいだしいいかな〜って気もするのですが、一応取得しておきましょうか。
取得方法は結構面倒でして、現在登録済みの関数を全部取得して、その中からgetinfoで返すテーブルのfunc(function型)に当てはまるものを探し出すって寸法になります。
ってことで、まずは全関数のテーブルをつくるところから。
--lua FunctionTable=nil; function functiontable() local function infunctiontable(t,d,n) local f,v; f,v = next(t,nil); while f do if (type(v)=="function")then d[n..f] = v; end; f,v = next(t,f); end; end; local f,v; if not(FunctionTable==nil)then return FunctionTable; end; FunctionTable={}; f,v = next(package.loaded,nil); while f do if (type(v)=="table")then if (f=="_G")then infunctiontable(v,FunctionTable , ""); else infunctiontable(v,FunctionTable , f.."."); end; end; f,v = next(package.loaded,f); end; return FunctionTable; end;
ふぅ〜。
結構重いと思われる処理なので、一回作ったらグローバルのFunctionTableに蓄えておいて、次回からそれを参照するようにされていること以外は、package.loadedからひたすらテーブル内のfunction型を漁ります。
ちなみに、package.loadedには_Gテーブルも含まれているので、loadedだけで全部参照できるって寸法です。
で、名前対応テーブルが出来たので、あとは引いてくる関数を作ります。
-- lua function getfunctionname(func) local t; t=functiontable(); local f,v; f,v = next(t,nil); while f do if (v==func)then return f; end; f,v = next(t,f); end; return "noname" end;
くるくるまわすだけ。
-- lua function hoge() local t; t = debug.getinfo(1); print(getfunctionname(t.func)); end; --out hoge
こんな感じで取得できるはずです(テストしてない)。