在追踪lua源码过程中,有一堆的关于call的函数,令人眼花缭乱,如果不稍作整理,就很难掌握什么情况下调用哪个call函数,以下是列举的几个call相关函数
type void (*Pfunc)(lua_State*L, void* ud);
void (lua_call)(lua_State*L, int nargs, int nresults);
int (lua_pcall)(lua_State*L, int nargs, int nresults, int errfunc);
int (lua_cpcall)(lua_State*L, lua_CFunction func, void* ud);
int (luaB_pcall)(lua_State*L);
int (luaB_xpcall)(lua_State*L);
int (luaD_callhook)(lua_State*L, int event, int line);
int (luaD_call)(lua_State*L, StkId func, int nResults);
int (luaD_precall)(lua_State*L, StkId func, int nResults);
int (luaD_pcall)(lua_State*L, Pfunc func, void* u, ptrdiff_t oldtop, ptrdff_t ef);
int (luaD_poscall)(lua_State*L, StkId firstResult);
int (luaD_rawrunpretected)(lua_State*L, Pfunc f, void* ud);
确实是眼花缭乱对吧,我们就围绕这几个函数做进一步追踪,慢慢理解。
一 、luaB_开头的,位于lua的baselib,这个属于基础库,注册于_G表中,可以说是给脚本使用的函数,C++里面不会直接调用
而对应的lua语言的function名为 luaB_pcall --> pcall(nArg)

这篇博客详细解析了lua源码中与调用相关的函数,包括luaB_开头的基础库函数、lua_pcall、lua_cpcall和lua_call。文章指出lua_pcall和lua_cpcall分别用于调用lua脚本定义的函数和C语言编写的函数,并深入探讨了它们如何通过luaD_pcall和luaD_call等底层函数进行调用处理。luaD_call作为所有函数调用的最终归宿,负责执行lua函数或C函数。通过层次分析,帮助读者理解lua调用机制。
最低0.47元/天 解锁文章
963

被折叠的 条评论
为什么被折叠?



