diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.13 2000/03/16 18:03:09 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.14 2000/03/17 13:09:46 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 | */ |
@@ -337,8 +337,23 @@ static OpCode invertjump (OpCode op) { | |||
337 | 337 | ||
338 | static void luaK_jump (FuncState *fs, OpCode jump) { | 338 | static void luaK_jump (FuncState *fs, OpCode jump) { |
339 | Instruction previous = prepare(fs, CREATE_S(jump, 0), -1); | 339 | Instruction previous = prepare(fs, CREATE_S(jump, 0), -1); |
340 | if (previous == CREATE_0(OP_NOT)) | 340 | switch (GET_OPCODE(previous)) { |
341 | setprevious(fs, CREATE_S(invertjump(jump), 0)); | 341 | case OP_NOT: previous = CREATE_S(invertjump(jump), 0); break; |
342 | case OP_PUSHINT: | ||
343 | if (jump == OP_IFTJMP) { | ||
344 | previous = CREATE_S(OP_JMP, 0); | ||
345 | break; | ||
346 | } | ||
347 | 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; | ||
355 | } | ||
356 | setprevious(fs, previous); | ||
342 | } | 357 | } |
343 | 358 | ||
344 | 359 | ||