在追踪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++里面不会直接