static int currentline (StkId f) { if (!isLmark(f)) return -1; /* only active lua functions have current-line information */ else { CallInfo *ci = infovalue(f); int *lineinfo = ci->func->f.l->lineinfo; return luaG_getline(lineinfo, currentpc(f), 1, NULL); } }
static void traceexec (lua_State *L, StkId base, StkId top, lua_Hook linehook) { CallInfo *ci = infovalue(base-1); int *lineinfo = ci->func->f.l->lineinfo; int pc = (*ci->pc - ci->func->f.l->code) - 1; int newline; if (pc == 0) { /* may be first time? */ ci->line = 1; ci->refi = 0; ci->lastpc = pc+1; /* make sure it will call linehook */ } newline = luaG_getline(lineinfo, pc, ci->line, &ci->refi); /* calls linehook when enters a new line or jumps back (loop) */ if (newline != ci->line || pc <= ci->lastpc) { ci->line = newline; L->top = top; luaD_lineHook(L, base-2, newline, linehook); } ci->lastpc = pc; }
static void PrintCode(const Proto* tf) { const Instruction* code=tf->code; const Instruction* p=code; for (;;) { int at=p-code+1; Instruction i=*p; int line=luaG_getline(tf->lineinfo,at-1,1,NULL); printf("%6d\t",at); if (line>=0) printf("[%d]\t",line); else printf("[-]\t"); switch (GET_OPCODE(i)) { #include "print.h" } printf("\n"); if (i==OP_END) break; p++; } }