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

こんな感じで取得できるはずです(テストしてない)。