aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldebug.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/ldebug.c b/ldebug.c
index 050cc6c8..6ab85434 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.24 2000/06/26 19:28:31 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.25 2000/06/28 20:20:36 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*/
@@ -245,15 +245,27 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
245 top++; /* `arg' */ 245 top++; /* `arg' */
246 while (pc < lastpc) { 246 while (pc < lastpc) {
247 const Instruction i = code[pc++]; 247 const Instruction i = code[pc++];
248 LUA_ASSERT(NULL, top <= pt->maxstacksize, "wrong stack");
248 switch (GET_OPCODE(i)) { 249 switch (GET_OPCODE(i)) {
250 case OP_RETURN: {
251 LUA_ASSERT(NULL, top >= GETARG_U(i), "wrong stack");
252 top = GETARG_U(i);
253 break;
254 }
249 case OP_CALL: { 255 case OP_CALL: {
250 int nresults = GETARG_B(i); 256 int nresults = GETARG_B(i);
251 if (nresults == MULT_RET) nresults = 1; 257 if (nresults == MULT_RET) nresults = 1;
258 LUA_ASSERT(NULL, top >= GETARG_A(i), "wrong stack");
252 top = GETARG_A(i); 259 top = GETARG_A(i);
253 while (nresults--) 260 while (nresults--)
254 stack[top++] = pc-1; 261 stack[top++] = pc-1;
255 break; 262 break;
256 } 263 }
264 case OP_TAILCALL: {
265 LUA_ASSERT(NULL, top >= GETARG_A(i), "wrong stack");
266 top = GETARG_B(i);
267 break;
268 }
257 case OP_PUSHNIL: { 269 case OP_PUSHNIL: {
258 int n; 270 int n;
259 for (n=0; n<GETARG_U(i); n++) 271 for (n=0; n<GETARG_U(i); n++)
@@ -281,12 +293,12 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
281 case OP_JMPONT: 293 case OP_JMPONT:
282 case OP_JMPONF: { 294 case OP_JMPONF: {
283 int newpc = pc + GETARG_S(i); 295 int newpc = pc + GETARG_S(i);
284 if (newpc >= lastpc) { 296 if (lastpc < newpc)
297 top--; /* original code did not jump; condition was false */
298 else {
285 stack[top-1] = pc-1; /* value generated by or-and */ 299 stack[top-1] = pc-1; /* value generated by or-and */
286 pc = newpc; /* do the jump */ 300 pc = newpc; /* do the jump */
287 } 301 }
288 else
289 top--; /* original code did not jump; condition was false */
290 break; 302 break;
291 } 303 }
292 case OP_PUSHNILJMP: { 304 case OP_PUSHNILJMP: {
@@ -302,6 +314,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
302 LUA_ASSERT(NULL, luaK_opproperties[GET_OPCODE(i)].push != VD, 314 LUA_ASSERT(NULL, luaK_opproperties[GET_OPCODE(i)].push != VD,
303 "invalid opcode for default"); 315 "invalid opcode for default");
304 top -= luaK_opproperties[GET_OPCODE(i)].pop; 316 top -= luaK_opproperties[GET_OPCODE(i)].pop;
317 LUA_ASSERT(NULL, top >= 0, "wrong stack");
305 for (n=0; n<luaK_opproperties[GET_OPCODE(i)].push; n++) 318 for (n=0; n<luaK_opproperties[GET_OPCODE(i)].push; n++)
306 stack[top++] = pc-1; 319 stack[top++] = pc-1;
307 } 320 }