阅前提示
该篇文章主要结合tolua.c 源码,逐行逐句分析ToLua中Wrap文件的运作原理。
适合人群:lua使用人群
阅读方式:浏览
扩展阅读:Lua C语言API
Tolua
开门见山,Tolua懂的都懂,这里就不赘述了。
有关Tolua介绍和使用的文章很多,例如:点击查看
Wrap
在Tolua生成的Wrap文件中,经常遇见如此写法。
// XXXWrap.cs
L.BeginStaticLibs("XXX");
L.RegFunction("Log", Log);
L.EndStaticLibs();
就很神奇的可以使用Lua来调用这些C#类的方法了。
接下来作者便深入其中,逐一分析这三句话究竟做了些什么。
BeginStaticLibs
首先BeginStaticLibs最终会走到这条语句上来:LuaDLL.tolua_beginstaticclass(L, name);
这语句会执行tolua dll 的C语言对应方法,tolua_beginstaticclass ,该方法 最终会在lua_State栈顶生成一个名为name的table
/* tolua.c */
LUALIB_API void tolua_beginstaticclass(lua_State *L, const char *name)
{
lua_pushstring(L, name); /* 将name 压入栈中,即 XXX */
lua_newtable(L);/* 创建一个table 压入栈中*/
_addtoloaded(L);
lua_pushvalue(L, -1);
/* 这里将栈顶表复制了一份压入栈中 即top [XXX(table),XXX(emptytable)] bottom */
/* 以上操作相当于生成了名为name的table :XXX = {} */
/* 以下操作抽象理解 */
/* XXX["userdata"] = &tag */
lua_pushlightuserdata(L, &tag);
lua_pushnumber(L, 1);
lua_rawset(L, -3);
/* XXX[".name"] = XXX */
lua_pushstring(L, ".name");
_pushfullname(L, -4);
lua_rawset(L, -3);
/* XXX["__index"] = static_index_event */
lua_pushstring(L, "__index");
lua_pushcfunction(L, static_index_event)