aboutsummaryrefslogtreecommitdiff
path: root/ldebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldebug.c')
-rw-r--r--ldebug.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/ldebug.c b/ldebug.c
index d42b161a..cae7e8d7 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.151 2003/04/28 13:31:06 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.152 2003/05/13 20:15:59 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,8 +296,16 @@ static int checkopenop (const Proto *pt, int pc) {
296} 296}
297 297
298 298
299static int checkRK (const Proto *pt, int r) { 299static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
300 return (r < pt->maxstacksize || (r >= MAXSTACK && r-MAXSTACK < pt->sizek)); 300 switch (mode) {
301 case OpArgN: check(r == 0); break;
302 case OpArgU: break;
303 case OpArgR: checkreg(pt, r); break;
304 case OpArgK:
305 check(r < pt->maxstacksize || (r >= MAXSTACK && r-MAXSTACK < pt->sizek));
306 break;
307 }
308 return 1;
301} 309}
302 310
303 311
@@ -317,29 +325,28 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
317 case iABC: { 325 case iABC: {
318 b = GETARG_B(i); 326 b = GETARG_B(i);
319 c = GETARG_C(i); 327 c = GETARG_C(i);
320 if (testOpMode(op, OpModeBreg)) { 328 check(checkArgMode(pt, b, getBMode(op)));
321 checkreg(pt, b); 329 check(checkArgMode(pt, c, getCMode(op)));
322 }
323 else if (testOpMode(op, OpModeBrk))
324 check(checkRK(pt, b));
325 if (testOpMode(op, OpModeCrk))
326 check(checkRK(pt, c));
327 break; 330 break;
328 } 331 }
329 case iABx: { 332 case iABx: {
330 b = GETARG_Bx(i); 333 b = GETARG_Bx(i);
331 if (testOpMode(op, OpModeK)) check(b < pt->sizek); 334 if (getBMode(op) == OpArgK) check(b < pt->sizek);
332 break; 335 break;
333 } 336 }
334 case iAsBx: { 337 case iAsBx: {
335 b = GETARG_sBx(i); 338 b = GETARG_sBx(i);
339 if (getBMode(op) == OpArgR) {
340 int dest = pc+1+b;
341 check(0 <= dest && dest < pt->sizecode);
342 }
336 break; 343 break;
337 } 344 }
338 } 345 }
339 if (testOpMode(op, OpModesetA)) { 346 if (testAMode(op)) {
340 if (a == reg) last = pc; /* change register `a' */ 347 if (a == reg) last = pc; /* change register `a' */
341 } 348 }
342 if (testOpMode(op, OpModeT)) { 349 if (testTMode(op)) {
343 check(pc+2 < pt->sizecode); /* check skip */ 350 check(pc+2 < pt->sizecode); /* check skip */
344 check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); 351 check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);
345 } 352 }
@@ -369,21 +376,21 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
369 break; 376 break;
370 } 377 }
371 case OP_CONCAT: { 378 case OP_CONCAT: {
372 /* `c' is a register, and at least two operands */ 379 check(b < c); /* at least two operands */
373 check(c < MAXSTACK && b < c);
374 break; 380 break;
375 } 381 }
376 case OP_TFORLOOP: 382 case OP_TFORLOOP: {
377 checkreg(pt, a+5); 383 checkreg(pt, a+5); /* space for control variables */
378 if (reg >= a) last = pc; /* affect all registers above base */ 384 if (reg >= a) last = pc; /* affect all registers above base */
379 /* go through */ 385 break;
386 }
387 case OP_TFORPREP:
380 case OP_FORLOOP: 388 case OP_FORLOOP:
381 case OP_FORPREP: 389 case OP_FORPREP:
382 checkreg(pt, a+2); 390 checkreg(pt, a+3);
383 /* go through */ 391 /* go through */
384 case OP_JMP: { 392 case OP_JMP: {
385 int dest = pc+1+b; 393 int dest = pc+1+b;
386 check(0 <= dest && dest < pt->sizecode);
387 /* not full check and jump is forward and do not skip `lastpc'? */ 394 /* not full check and jump is forward and do not skip `lastpc'? */
388 if (reg != NO_REG && pc < dest && dest <= lastpc) 395 if (reg != NO_REG && pc < dest && dest <= lastpc)
389 pc += b; /* do the jump */ 396 pc += b; /* do the jump */