diff options
Diffstat (limited to 'ldebug.c')
-rw-r--r-- | ldebug.c | 28 |
1 files changed, 15 insertions, 13 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.86 2001/06/28 19:58:57 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.87 2001/07/03 17:01:34 roberto Exp $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -117,7 +117,7 @@ int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) { | |||
117 | static int currentpc (CallInfo *ci) { | 117 | static int currentpc (CallInfo *ci) { |
118 | lua_assert(isLmark(ci)); | 118 | lua_assert(isLmark(ci)); |
119 | if (ci->pc) | 119 | if (ci->pc) |
120 | return (*ci->pc - ci_func(ci)->f.l->code) - 1; | 120 | return (*ci->pc - ci_func(ci)->u.l.p->code) - 1; |
121 | else | 121 | else |
122 | return -1; /* function is not active */ | 122 | return -1; /* function is not active */ |
123 | } | 123 | } |
@@ -127,7 +127,7 @@ static int currentline (CallInfo *ci) { | |||
127 | if (!isLmark(ci)) | 127 | if (!isLmark(ci)) |
128 | return -1; /* only active lua functions have current-line information */ | 128 | return -1; /* only active lua functions have current-line information */ |
129 | else { | 129 | else { |
130 | int *lineinfo = ci_func(ci)->f.l->lineinfo; | 130 | int *lineinfo = ci_func(ci)->u.l.p->lineinfo; |
131 | return luaG_getline(lineinfo, currentpc(ci), 1, NULL); | 131 | return luaG_getline(lineinfo, currentpc(ci), 1, NULL); |
132 | } | 132 | } |
133 | } | 133 | } |
@@ -135,7 +135,7 @@ static int currentline (CallInfo *ci) { | |||
135 | 135 | ||
136 | 136 | ||
137 | static Proto *getluaproto (CallInfo *ci) { | 137 | static Proto *getluaproto (CallInfo *ci) { |
138 | return (isLmark(ci) ? ci_func(ci)->f.l : NULL); | 138 | return (isLmark(ci) ? ci_func(ci)->u.l.p : NULL); |
139 | } | 139 | } |
140 | 140 | ||
141 | 141 | ||
@@ -199,7 +199,7 @@ static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { | |||
199 | ar->what = l_s("C"); | 199 | ar->what = l_s("C"); |
200 | } | 200 | } |
201 | else | 201 | else |
202 | infoLproto(ar, cl->f.l); | 202 | infoLproto(ar, cl->u.l.p); |
203 | luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); | 203 | luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); |
204 | if (ar->linedefined == 0) | 204 | if (ar->linedefined == 0) |
205 | ar->what = l_s("main"); | 205 | ar->what = l_s("main"); |
@@ -323,14 +323,15 @@ static int precheck (const Proto *pt) { | |||
323 | } | 323 | } |
324 | 324 | ||
325 | 325 | ||
326 | static int checkopenop (Instruction i) { | 326 | static int checkopenop (const Proto *pt, int pc) { |
327 | OpCode op = GET_OPCODE(i); | 327 | Instruction i = pt->code[pc+1]; |
328 | switch (op) { | 328 | switch (GET_OPCODE(i)) { |
329 | case OP_CALL: | 329 | case OP_CALL: |
330 | case OP_RETURN: { | 330 | case OP_RETURN: { |
331 | check(GETARG_B(i) == NO_REG); | 331 | check(GETARG_B(i) == NO_REG); |
332 | return 1; | 332 | return 1; |
333 | } | 333 | } |
334 | case OP_CLOSE: return checkopenop(pt, pc+1); | ||
334 | case OP_SETLISTO: return 1; | 335 | case OP_SETLISTO: return 1; |
335 | default: return 0; /* invalid instruction after an open call */ | 336 | default: return 0; /* invalid instruction after an open call */ |
336 | } | 337 | } |
@@ -382,7 +383,8 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
382 | last = pc; /* set registers from `a' to `b' */ | 383 | last = pc; /* set registers from `a' to `b' */ |
383 | break; | 384 | break; |
384 | } | 385 | } |
385 | case OP_LOADUPVAL: { | 386 | case OP_GETUPVAL: |
387 | case OP_SETUPVAL: { | ||
386 | check(b < pt->nupvalues); | 388 | check(b < pt->nupvalues); |
387 | break; | 389 | break; |
388 | } | 390 | } |
@@ -419,7 +421,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
419 | checkreg(pt, a+b); | 421 | checkreg(pt, a+b); |
420 | } | 422 | } |
421 | if (c == NO_REG) { | 423 | if (c == NO_REG) { |
422 | check(checkopenop(pt->code[pc+1])); | 424 | check(checkopenop(pt, pc)); |
423 | } | 425 | } |
424 | else if (c != 0) | 426 | else if (c != 0) |
425 | checkreg(pt, a+c-1); | 427 | checkreg(pt, a+c-1); |
@@ -452,7 +454,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { | |||
452 | } | 454 | } |
453 | case OP_CLOSURE: { | 455 | case OP_CLOSURE: { |
454 | check(b < pt->sizep); | 456 | check(b < pt->sizep); |
455 | checkreg(pt, a + pt->p[b]->nupvalues - 1); | 457 | check(pc + pt->p[b]->nupvalues < pt->sizecode); |
456 | break; | 458 | break; |
457 | } | 459 | } |
458 | default: break; | 460 | default: break; |
@@ -472,7 +474,7 @@ int luaG_checkcode (const Proto *pt) { | |||
472 | static const l_char *getobjname (lua_State *L, StkId obj, const l_char **name) { | 474 | static const l_char *getobjname (lua_State *L, StkId obj, const l_char **name) { |
473 | CallInfo *ci = ci_stack(L, obj); | 475 | CallInfo *ci = ci_stack(L, obj); |
474 | if (isLmark(ci)) { /* an active Lua function? */ | 476 | if (isLmark(ci)) { /* an active Lua function? */ |
475 | Proto *p = ci_func(ci)->f.l; | 477 | Proto *p = ci_func(ci)->u.l.p; |
476 | int pc = currentpc(ci); | 478 | int pc = currentpc(ci); |
477 | int stackpos = obj - ci->base; | 479 | int stackpos = obj - ci->base; |
478 | Instruction i; | 480 | Instruction i; |
@@ -516,7 +518,7 @@ static const l_char *getfuncname (lua_State *L, CallInfo *ci, | |||
516 | if (ci == &L->basefunc || !isLmark(ci)) | 518 | if (ci == &L->basefunc || !isLmark(ci)) |
517 | return NULL; /* not an active Lua function */ | 519 | return NULL; /* not an active Lua function */ |
518 | else { | 520 | else { |
519 | Proto *p = ci_func(ci)->f.l; | 521 | Proto *p = ci_func(ci)->u.l.p; |
520 | int pc = currentpc(ci); | 522 | int pc = currentpc(ci); |
521 | Instruction i; | 523 | Instruction i; |
522 | if (pc == -1) return NULL; /* function is not activated */ | 524 | if (pc == -1) return NULL; /* function is not activated */ |