aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-14 14:46:27 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-14 14:46:27 -0300
commit58453dc1e1cb8c77f91cb858ec9b475a945f7f3c (patch)
tree0ad99964acf87f941b318f6edbe9413b71b7e8b6
parentf555e493f0a12513f79f999ceed5467085b1c9c4 (diff)
downloadlua-58453dc1e1cb8c77f91cb858ec9b475a945f7f3c.tar.gz
lua-58453dc1e1cb8c77f91cb858ec9b475a945f7f3c.tar.bz2
lua-58453dc1e1cb8c77f91cb858ec9b475a945f7f3c.zip
small bug in symbolic execution
-rw-r--r--lcode.c5
-rw-r--r--ldebug.c37
-rw-r--r--lparser.c5
3 files changed, 28 insertions, 19 deletions
diff --git a/lcode.c b/lcode.c
index 33236931..bd0d2612 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.46 2000/08/09 19:16:57 roberto Exp roberto $ 2** $Id: lcode.c,v 1.47 2000/08/10 19:50:47 roberto Exp roberto $
3** Code generator for Lua 3** Code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -330,7 +330,8 @@ void luaK_tostack (LexState *ls, expdesc *v, int onlyone) {
330 luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */ 330 luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */
331 else { 331 else {
332 j = code_label(fs, OP_JMP, NO_JUMP); /* to jump over both pushes */ 332 j = code_label(fs, OP_JMP, NO_JUMP); /* to jump over both pushes */
333 luaK_deltastack(fs, -1); /* next PUSHes may be skipped */ 333 /* correct stack for compiler and simbolic execution */
334 luaK_adjuststack(fs, 1);
334 } 335 }
335 p_nil = code_label(fs, OP_PUSHNILJMP, 0); 336 p_nil = code_label(fs, OP_PUSHNILJMP, 0);
336 p_1 = code_label(fs, OP_PUSHINT, 1); 337 p_1 = code_label(fs, OP_PUSHINT, 1);
diff --git a/ldebug.c b/ldebug.c
index e0b3925a..136afc5a 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.32 2000/08/10 19:50:47 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.33 2000/08/11 16:17:28 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*/
@@ -296,11 +296,15 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
296 const Instruction i = code[pc++]; 296 const Instruction i = code[pc++];
297 LUA_ASSERT(0 <= top && top <= pt->maxstacksize, "wrong stack"); 297 LUA_ASSERT(0 <= top && top <= pt->maxstacksize, "wrong stack");
298 switch (GET_OPCODE(i)) { 298 switch (GET_OPCODE(i)) {
299 case OP_RETURN: 299 case OP_RETURN: {
300 case OP_TAILCALL: 300 LUA_ASSERT(top >= GETARG_U(i), "wrong stack");
301 case OP_END: { 301 top = GETARG_U(i);
302 LUA_INTERNALERROR("invalid symbolic run"); 302 break;
303 return CREATE_0(OP_END); /* stop execution */ 303 }
304 case OP_TAILCALL: {
305 LUA_ASSERT(top >= GETARG_A(i), "wrong stack");
306 top = GETARG_B(i);
307 break;
304 } 308 }
305 case OP_CALL: { 309 case OP_CALL: {
306 int nresults = GETARG_B(i); 310 int nresults = GETARG_B(i);
@@ -336,6 +340,18 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
336 stack[top++] = pc-1; 340 stack[top++] = pc-1;
337 break; 341 break;
338 } 342 }
343 case OP_JMPONT:
344 case OP_JMPONF: {
345 int newpc = pc + GETARG_S(i);
346 /* jump is forward and do not skip `lastpc'? */
347 if (pc < newpc && newpc <= lastpc) {
348 stack[top-1] = pc-1; /* value comes from `and'/`or' */
349 pc = newpc; /* do the jump */
350 }
351 else
352 top--; /* do not jump; pop value */
353 break;
354 }
339 default: { 355 default: {
340 OpCode op = GET_OPCODE(i); 356 OpCode op = GET_OPCODE(i);
341 LUA_ASSERT(luaK_opproperties[op].push != VD, 357 LUA_ASSERT(luaK_opproperties[op].push != VD,
@@ -343,15 +359,6 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) {
343 top -= luaK_opproperties[op].pop; 359 top -= luaK_opproperties[op].pop;
344 LUA_ASSERT(top >= 0, "wrong stack"); 360 LUA_ASSERT(top >= 0, "wrong stack");
345 top = pushpc(stack, pc, top, luaK_opproperties[op].push); 361 top = pushpc(stack, pc, top, luaK_opproperties[op].push);
346 if (ISJUMP(op)) {
347 int newpc = pc + GETARG_S(i);
348 /* jump is forward and do not skip `lastpc'? */
349 if (pc < newpc && newpc <= lastpc) {
350 if (op == OP_JMPONT || op == OP_JMPONF)
351 stack[top++] = pc-1; /* do not pop when jumping */
352 pc = newpc; /* do the jump */
353 }
354 }
355 } 362 }
356 } 363 }
357 } 364 }
diff --git a/lparser.c b/lparser.c
index ef4a57ab..cc9a6c9a 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.106 2000/08/09 14:49:13 roberto Exp roberto $ 2** $Id: lparser.c,v 1.107 2000/08/09 19:16:57 roberto Exp roberto $
3** LL(1) Parser and code generator for Lua 3** LL(1) Parser and code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1024,7 +1024,8 @@ static void breakstat (LexState *ls) {
1024 next(ls); /* skip BREAK */ 1024 next(ls); /* skip BREAK */
1025 luaK_adjuststack(fs, currentlevel - bl->stacklevel); 1025 luaK_adjuststack(fs, currentlevel - bl->stacklevel);
1026 luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); 1026 luaK_concat(fs, &bl->breaklist, luaK_jump(fs));
1027 fs->stacklevel = currentlevel; 1027 /* correct stack for compiler and simbolic execution */
1028 luaK_adjuststack(fs, bl->stacklevel - currentlevel);
1028} 1029}
1029 1030
1030 1031