aboutsummaryrefslogtreecommitdiff
path: root/ldebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldebug.c')
-rw-r--r--ldebug.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/ldebug.c b/ldebug.c
index bfc3763f..60fdfa37 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.27 2000/06/30 14:35:17 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.28 2000/08/07 20:21:34 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -99,6 +99,34 @@ static int lua_nups (StkId f) {
99} 99}
100 100
101 101
102int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) {
103 int refi = prefi ? *prefi : 0;
104 if (lineinfo[refi] < 0)
105 refline += -lineinfo[refi++];
106 LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info");
107 while (lineinfo[refi] > pc) {
108 refline--;
109 refi--;
110 if (lineinfo[refi] < 0)
111 refline -= -lineinfo[refi--];
112 LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info");
113 }
114 for (;;) {
115 int nextline = refline + 1;
116 int nextref = refi + 1;
117 if (lineinfo[nextref] < 0)
118 nextline += -lineinfo[nextref++];
119 LUA_ASSERT(lineinfo[nextref] >= 0, "invalid line info");
120 if (lineinfo[nextref] > pc)
121 break;
122 refline = nextline;
123 refi = nextref;
124 }
125 if (prefi) *prefi = refi;
126 return refline;
127}
128
129
102static int lua_currentpc (StkId f) { 130static int lua_currentpc (StkId f) {
103 CallInfo *ci = infovalue(f); 131 CallInfo *ci = infovalue(f);
104 LUA_ASSERT(ttype(f) == TAG_LMARK, "function has no pc"); 132 LUA_ASSERT(ttype(f) == TAG_LMARK, "function has no pc");
@@ -111,9 +139,10 @@ static int lua_currentline (StkId f) {
111 return -1; /* only active lua functions have current-line information */ 139 return -1; /* only active lua functions have current-line information */
112 else { 140 else {
113 CallInfo *ci = infovalue(f); 141 CallInfo *ci = infovalue(f);
114 int *lines = ci->func->f.l->lines; 142 int *lineinfo = ci->func->f.l->lineinfo;
115 if (!lines) return -1; /* no static debug information */ 143 if (!lineinfo) return -1; /* no static debug information */
116 else return lines[lua_currentpc(f)]; 144 else
145 return luaG_getline(lineinfo, lua_currentpc(f), 1, NULL);
117 } 146 }
118} 147}
119 148