commit da7eb34cd621325066df3e99a9af39fa0d036a85
parent 2c8e28d75a09fb6de3c3b16a64561a0103866cea
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 17 Mar 2000 11:45:42 -0300
optimization for "while 1" and "repeat until nil"
Diffstat:
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/lcode.c b/lcode.c
@@ -1,5 +1,5 @@
/*
-** $Id: lcode.c,v 1.13 2000/03/16 18:03:09 roberto Exp roberto $
+** $Id: lcode.c,v 1.14 2000/03/17 13:09:46 roberto Exp roberto $
** Code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -337,8 +337,23 @@ static OpCode invertjump (OpCode op) {
static void luaK_jump (FuncState *fs, OpCode jump) {
Instruction previous = prepare(fs, CREATE_S(jump, 0), -1);
- if (previous == CREATE_0(OP_NOT))
- setprevious(fs, CREATE_S(invertjump(jump), 0));
+ switch (GET_OPCODE(previous)) {
+ case OP_NOT: previous = CREATE_S(invertjump(jump), 0); break;
+ case OP_PUSHINT:
+ if (jump == OP_IFTJMP) {
+ previous = CREATE_S(OP_JMP, 0);
+ break;
+ }
+ else return; /* do not set previous */
+ case OP_PUSHNIL:
+ if (jump == OP_IFFJMP) {
+ previous = CREATE_S(OP_JMP, 0);
+ break;
+ }
+ else return; /* do not set previous */
+ default: return;
+ }
+ setprevious(fs, previous);
}