ToLua:逐行分析源码,搞清楚Wrap文件原理

本文通过逐行分析tolua.c源码,详细解释ToLua中Wrap文件的工作原理,特别是C#方法如何通过BeginStaticLibs、EndStaticLibs和RegFunction在Lua中注册和调用。内容涵盖了lua_pushcfunction和lua_pushcclosure在创建闭包过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅前提示

该篇文章主要结合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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值