LUA源码分析九:Debug."getlocal"
?
函数:{"getlocal", db_getlocal}
从db_getlocal开始跟调.该函数是把自身的所有变量打印出来。大体的思路是算到执行码,根据执行码的大小限制,遍历函数保存的变量信息,然后依次打印。
?
?
?
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中的判断过程
?
?