diff options
Diffstat (limited to 'ldebug.c')
-rw-r--r-- | ldebug.c | 47 |
1 files changed, 27 insertions, 20 deletions
@@ -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 | ||
299 | static int checkRK (const Proto *pt, int r) { | 299 | static 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 */ |