函数:{"getlocal", db_getlocal}
从db_getlocal开始跟调.该函数是把自身的所有变量打印出来。大体的思路是算到执行码,根据执行码的大小限制,遍历函数保存的变量信息,然后依次打印。
static int db_getlocal (lua_State *L) {
int arg;
lua_State *L1 = getthread(L, &arg);
lua_Debug ar;
const char *name;
/*
根据level算出L->ci 和 L->base_ci之间的偏差值。见段1
*/
if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */
return luaL_argerror(L, arg+1, "level out of range");
/*
这里的ar只是有一个偏移值,具体的还在lua_getlocal里边。见段2
*/
name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2));
if (name) {
lua_xmove(L1, L, 1);
lua_pushstring(L, name);
lua_pushvalue(L, -2);
return 2;
}
else {
lua_pushnil(L);
return 1;
}
}
/*
段1
*/
CallInfo是要调用的函数信息,数组形式。这里通过level来算出是第几个CallInfo.
其中一个CallInfo里可能有tailcalls(这是什么还不知道,也算是一种函数调用的优化吧),而
tailcalls是计算到level里面的。比如
0x40 L->ci
0x30 CI(5)
0x20 CI(0)
0x10 CI(0)
..
0x00 L->base_ci, 可能base在这
括号表示tailcalls,这时level为7,取得的是0x10的目标CI,返回base_ci到0x10的偏差
LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
int status;
CallInfo *ci;
lua_lock(L);
/*
L->ci,顶部CallInfo信息
L->base_ci,底部CallInfo信息
*/
for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {
level--;
if (f_isLua(ci)) /* Lua function? */
level -= ci->tailcalls; /* skip lost tail calls */
}
if (level == 0 && ci > L->base_ci) { /* level found? */
status = 1;
/*
算出目标CallInfo的偏差值
*/
ar->i_ci = cast_int(ci - L->base_ci);
}
else if (level < 0) { /* level is of a lost tail call? */
status = 1;
ar->i_ci = 0;
}
else status = 0; /* no such level */
lua_unlock(L);
return status;
}
/*
段2
*/
lua_getlocal函数的调用关系层如下
lua_getlocal (lua_State *L, const lua_Debug *ar, int n)
{
//根据ar里的偏差值,取到目标ci
CallInfo *ci = L->base_ci + ar->i_ci;
findlocal
Proto *fp = getluaproto(ci);
name = luaF_getlocalname(fp, n, currentpc(L, ci))
}
重点是findlocal的封装。
getluaproto返回函数的属性,先对currentpc展开
static int currentpc (lua_State *L, CallInfo *ci) {
if (!isLua(ci)) return -1; /* function is not a Lua function? */
/*
取的不一定是最末尾的ci
*/
if (ci == L->ci)
ci->savedpc = L->savedpc;
/*
pcRel宏扩展如下,算出ci的执行码和函数的执行码偏差值。中间可以看成塞入了其他
的信息,比如全局变量也会对这个差值造成影响
#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
*/
return pcRel(ci->savedpc, ci_func(ci)->l.p);
}
来到最后的luaF_getlocalname
const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
int i;
/*
locvars表示存放的函数变量,大小为f->sizelocvars
startpc...endpc,表示在这个范围内的为active变量。
*/
for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
if (pc < f->locvars[i].endpc) { /* is variable active? */
local_number--;
if (local_number == 0)
return getstr(f->locvars[i].varname);
}
}
return NULL; /* not found */
}
跟调了下l.p->code和startpc,endpc两个值,在parse的时候就被设置好。
startpc,endpc被设置成l.p->code类似的边界范围值,比如标识局部变量等。
而ci->savedpc和l.p->code之间势必还插入了其他的值,所以你会看到luaF_getlocalname中的判断过程
分享到:
相关推荐
功能应该是对luc反编译的cmd命令(java -jar unluac.jar --rawstring d:\xx.lua>d:\xx.lua)进行了封装 使用时发现反编译出来的汉字未进行解码 用.Net Reflector反编译进行查看,发现程序封装的命令少了--rawstring...
使用lua编写的YGoPro卡片脚本.zip使用lua编写的YGoPro卡片脚本.zip使用lua编写的YGoPro卡片脚本.zip使用lua编写的YGoPro卡片脚本.zip使用lua编写的YGoPro卡片脚本.zip使用lua编写的YGoPro卡片脚本.zip使用lua编写的...
lua-linenoise:支持UTF-8的linenoise的Lua绑定(https:github.comyhiroselinenoisetreeutf8-support)
llua的源码和php后台源码 ...4.俢改lua中的网站地址和其他数据 说明: 使用rc4加密重要信息,这样不容易被....应该吧 源码还在继续开发中,有什么意见可以评论! 源码可以随意俢改 开发 售卖 反正随便用
│ lua.exe │ lua51.dll │ lua51.lib │ luac.exe │ luadec.exe │ luaopswap.exe │ luareplace.exe │ ├─5.2 │ └─bin │ liblua52.lib │ lua.exe │ lua52.dll │ lua52.lib │ luac.exe │ luadec.exe ...
test pc: ubuntu 14.04 lua : 5.3.0 tools: bash, make demos: 1. test.lua ## hello world 2. function.lua ## 函数调用 3. param.lua ## 函数参数, 4. table ## table ...works/lua_demo$ lua test.lua
lua.vm.js Lua VM,在网络上在线演示: : 状态这是作为一个实验来观察Lua VM在网络上运行的速度而开始的。 那是成功的(firefox和chrome的性能都很好)。 下一步是迭代Lua <=> JS互操作性。 正在寻找针对Java语言...
在window下通过mingw编译过的的LuaBitOp-1.0.2(bit.dll)和lua-cjson-2.1.0(cjson.dll),可直接放在lua的clibs使用
图书馆goluago旨在成为Go语言工具链(最早的8c / 6c / 5c,最终可能是纯Go语言)的Lua 5.1解释器的移植端口。 该库尚处于开发的早期阶段(功能尚未完善/尚未投入生产),但一些重要目标已经成功完成:状态截至2016年...
a utf-8 support module for Lua and LuaJIT 源码地址:https://github.com/starwing/luautf8 编译后可用的库: Linux版:lua-utf8.so Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本...
adding: lua5.3.5-x86/lua.exe (in=14336) (out=7311) (deflated 49%) adding: lua5.3.5-x86/lua.o (in=24873) (out=9654) (deflated 61%) adding: lua5.3.5-x86/lua5.3.5-static.lib (in=662596) (out=244441) ...
内含luaDll,luacom以及luaiconv源码。luaDll和luaiconv直接打开sln在Visual studio中即可进行编译。luacom可使用nmake进行编译。也可直接使用已经生成了的dll.
Lua经典编程书籍, 编程指南.doc ,Lua程序设计_第二版_中文.dpf ,Programming in Lua, 2Nd Edition.pdf。 lua编程书籍,高清版,带目录,非常好的参考书
Binary Package lua-devel-5.1.4-4.1.el6.x86_64.rpm Source Package lua-5.1.4-4.1.el6.src.rpm Install HowtoInstall the lua-devel rpm package: ..
使用VS2022编译,包含: lua.exe luac.exe lua54.dll 使用方法: lua xxx.lua luac -o xxx.o xxx.lua lua xxx.o
所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...
Lua源码分析Lua源码分析Lua源码分析Lua源码分析Lua源码分析Lua源码分析Lua源码分析Lua源码分析
lua-5.2.2.tar.gz 可编译源代码,可以编译出LUA.exe、luac.exe、lua.lib。具体方法可以百度。
更新频率比较慢,使用lua_shared_dict进行存储。如下定义: lua_shared_dict sysconfig 10k; 成员包括: "time":配置文件的生成的时间戳(用来判断文件是否有更新)eg:1585209315 "kxsip":与可信控制服务数据交互...
lua-debug.nvim lua-debug.nvim是用于调试正在运行的Neovim实例的适配器。 请参阅以了解有关适配器的更多信息。 它允许您调试Neovim实例中运行的任何lua代码。 免责声明: lua-debug.nvim与具有相似的名称,但与...