diff options
Diffstat (limited to 'ldebug.c')
-rw-r--r-- | ldebug.c | 18 |
1 files changed, 7 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 2.36 2007/05/09 15:49:36 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.37 2007/05/29 18:59: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 | */ |
@@ -331,9 +331,9 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) { | |||
331 | int b = 0; | 331 | int b = 0; |
332 | int c = 0; | 332 | int c = 0; |
333 | check(op < NUM_OPCODES); | 333 | check(op < NUM_OPCODES); |
334 | checkreg(pt, a); | ||
335 | switch (getOpMode(op)) { | 334 | switch (getOpMode(op)) { |
336 | case iABC: { | 335 | case iABC: { |
336 | checkreg(pt, a); | ||
337 | b = GETARG_B(i); | 337 | b = GETARG_B(i); |
338 | c = GETARG_C(i); | 338 | c = GETARG_C(i); |
339 | check(checkArgMode(pt, b, getBMode(op))); | 339 | check(checkArgMode(pt, b, getBMode(op))); |
@@ -341,31 +341,27 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) { | |||
341 | break; | 341 | break; |
342 | } | 342 | } |
343 | case iABx: { | 343 | case iABx: { |
344 | checkreg(pt, a); | ||
344 | b = GETARG_Bx(i); | 345 | b = GETARG_Bx(i); |
345 | if (getBMode(op) == OpArgK) check(b < pt->sizek); | 346 | if (getBMode(op) == OpArgK) check(b < pt->sizek); |
346 | break; | 347 | break; |
347 | } | 348 | } |
348 | case iAsBx: { | 349 | case iAsBx: { |
350 | checkreg(pt, a); | ||
349 | b = GETARG_sBx(i); | 351 | b = GETARG_sBx(i); |
350 | if (getBMode(op) == OpArgR) { | 352 | if (getBMode(op) == OpArgR) { |
351 | int dest = pc+1+b; | 353 | int dest = pc+1+b; |
352 | check(0 <= dest && dest < pt->sizecode); | 354 | check(0 <= dest && dest < pt->sizecode); |
353 | if (dest > 0) { | ||
354 | /* cannot jump to a setlist count */ | ||
355 | Instruction d = pt->code[dest-1]; | ||
356 | check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)); | ||
357 | } | ||
358 | } | 355 | } |
359 | break; | 356 | break; |
360 | } | 357 | } |
358 | case iAx: break; | ||
361 | } | 359 | } |
362 | if (testAMode(op)) { | 360 | if (testAMode(op)) { |
363 | if (a == reg) last = pc; /* change register `a' */ | 361 | if (a == reg) last = pc; /* change register `a' */ |
364 | } | 362 | } |
365 | if (testTMode(op)) { | 363 | if (testTMode(op)) |
366 | check(pc+2 < pt->sizecode); /* check skip */ | ||
367 | check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); | 364 | check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); |
368 | } | ||
369 | switch (op) { | 365 | switch (op) { |
370 | case OP_LOADBOOL: { | 366 | case OP_LOADBOOL: { |
371 | check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ | 367 | check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ |
@@ -433,7 +429,7 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) { | |||
433 | } | 429 | } |
434 | case OP_SETLIST: { | 430 | case OP_SETLIST: { |
435 | if (b > 0) checkreg(pt, a + b); | 431 | if (b > 0) checkreg(pt, a + b); |
436 | if (c == 0) pc++; | 432 | if (c == 0) check(GET_OPCODE(pt->code[pc + 1]) == OP_EXTRAARG); |
437 | break; | 433 | break; |
438 | } | 434 | } |
439 | case OP_CLOSURE: { | 435 | case OP_CLOSURE: { |