diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 14 |
1 files changed, 5 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.14 2000/03/17 13:09:46 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.15 2000/03/17 14:46:04 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 | */ |
@@ -139,8 +139,7 @@ static void luaK_eq (FuncState *fs) { | |||
139 | static void luaK_neq (FuncState *fs) { | 139 | static void luaK_neq (FuncState *fs) { |
140 | Instruction previous = prepare(fs, CREATE_S(OP_IFNEQJMP, 0), -2); | 140 | Instruction previous = prepare(fs, CREATE_S(OP_IFNEQJMP, 0), -2); |
141 | if (previous == CREATE_U(OP_PUSHNIL, 1)) { | 141 | if (previous == CREATE_U(OP_PUSHNIL, 1)) { |
142 | fs->pc -= 2; /* remove PUSHNIL and IFNEQJMP */ | 142 | setprevious(fs, CREATE_S(OP_IFTJMP, 0)); |
143 | luaK_deltastack(fs, 1); /* undo delta from `prepare' */ | ||
144 | } | 143 | } |
145 | } | 144 | } |
146 | 145 | ||
@@ -345,12 +344,6 @@ static void luaK_jump (FuncState *fs, OpCode jump) { | |||
345 | break; | 344 | break; |
346 | } | 345 | } |
347 | else return; /* do not set previous */ | 346 | else return; /* do not set previous */ |
348 | case OP_PUSHNIL: | ||
349 | if (jump == OP_IFFJMP) { | ||
350 | previous = CREATE_S(OP_JMP, 0); | ||
351 | break; | ||
352 | } | ||
353 | else return; /* do not set previous */ | ||
354 | default: return; | 347 | default: return; |
355 | } | 348 | } |
356 | setprevious(fs, previous); | 349 | setprevious(fs, previous); |
@@ -419,6 +412,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) { | |||
419 | Instruction *previous; | 412 | Instruction *previous; |
420 | discharge1(fs, v); | 413 | discharge1(fs, v); |
421 | previous = &fs->f->code[fs->pc-1]; | 414 | previous = &fs->f->code[fs->pc-1]; |
415 | LUA_ASSERT(L, GET_OPCODE(*previous) != OP_SETLINE, "bad place to set line"); | ||
422 | if (ISJUMP(GET_OPCODE(*previous))) | 416 | if (ISJUMP(GET_OPCODE(*previous))) |
423 | SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); | 417 | SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); |
424 | else { | 418 | else { |
@@ -435,6 +429,7 @@ void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { | |||
435 | Instruction previous; | 429 | Instruction previous; |
436 | discharge1(fs, v); | 430 | discharge1(fs, v); |
437 | previous = fs->f->code[fs->pc-1]; | 431 | previous = fs->f->code[fs->pc-1]; |
432 | LUA_ASSERT(L, GET_OPCODE(previous) != OP_SETLINE, "bad place to set line"); | ||
438 | if (!ISJUMP(GET_OPCODE(previous))) { | 433 | if (!ISJUMP(GET_OPCODE(previous))) { |
439 | OpCode jump = keepvalue ? OP_ONTJMP : OP_IFTJMP; | 434 | OpCode jump = keepvalue ? OP_ONTJMP : OP_IFTJMP; |
440 | luaK_jump(fs, jump); | 435 | luaK_jump(fs, jump); |
@@ -450,6 +445,7 @@ void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { | |||
450 | if (discharge(fs, v)) return; | 445 | if (discharge(fs, v)) return; |
451 | else { /* is an expression */ | 446 | else { /* is an expression */ |
452 | OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); | 447 | OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); |
448 | LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line"); | ||
453 | if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { | 449 | if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { |
454 | /* it is an expression without jumps */ | 450 | /* it is an expression without jumps */ |
455 | if (onlyone && v->k == VEXP) | 451 | if (onlyone && v->k == VEXP) |