へっぽこチャンクネームスペース風メソッドコール

  • C側の実装
void Call(lua_State *L, const char *chunk, const char *func )
{
	lua_pushstring( L, chunk );
	lua_gettable( L, LUA_GLOBALSINDEX );
	lua_pushstring( L, func );
	lua_gettable( L, -2 );

	const int result = lua_pcall( L, 0, 0, 0 );
	if ( result != 0 )
	{
//		print_lua_error( result, "Call" );
	}

	//@?: chunk名をスタックから取り除く?.
	lua_pop( L, 1 );
}

main()
{
	// Lua初期化.
         ....

	lua_dofile("lua_test.lua");
	Call( "lua_test", "OnUpdate" );
}
  • Lua側の実装.
--lua_test.lua
lua_test = {
	OnUpdate = function()
		print("call lua_test::OnUpdate\n")
	end,
}

print("eval lua_test.lua\n")
>eval lua_test.lua
>call lua_test::OnUpdate

く、くるしい。
他にいい方法は無いのか。
この方法だとC側が簡単に書けていいんだけどね。
多分localにするとものすごい複雑な手順を踏まないと解決できない予感がするし。


@?:
の部分は通常のコールと違ってスタックを1個余計に使うのでやらないといけない予感。
やらないとスタックがあふれる予感。どうなんだろう。


それとリストの内部だとfunction OnUpdate()って書けない。バージョンによって違うのかなぁ。