diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-12 15:57:19 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-12 15:57:19 -0300 |
commit | f9cf402fbd1ba2ab00f5aa5f7d0ff5c9c0580dd5 (patch) | |
tree | 7bed49a7ff5c730cdfdef7c3a43b71e039d4442b /lcode.c | |
parent | 0c3fe2c44be155b11b52230e36f45e688bae5ce2 (diff) | |
download | lua-f9cf402fbd1ba2ab00f5aa5f7d0ff5c9c0580dd5.tar.gz lua-f9cf402fbd1ba2ab00f5aa5f7d0ff5c9c0580dd5.tar.bz2 lua-f9cf402fbd1ba2ab00f5aa5f7d0ff5c9c0580dd5.zip |
first implementation of FOR
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.22 2000/04/07 13:13:11 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.23 2000/04/07 19:35:20 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 | */ |
@@ -53,7 +53,6 @@ static void luaK_fixjump (FuncState *fs, int pc, int dest) { | |||
53 | SETARG_S(*jmp, NO_JUMP); /* point to itself to represent end of list */ | 53 | SETARG_S(*jmp, NO_JUMP); /* point to itself to represent end of list */ |
54 | else { /* jump is relative to position following jump instruction */ | 54 | else { /* jump is relative to position following jump instruction */ |
55 | int offset = dest-(pc+1); | 55 | int offset = dest-(pc+1); |
56 | LUA_ASSERT(L, offset != NO_JUMP, "cannot link to itself"); | ||
57 | if (abs(offset) > MAXARG_S) | 56 | if (abs(offset) > MAXARG_S) |
58 | luaK_error(fs->ls, "control structure too long"); | 57 | luaK_error(fs->ls, "control structure too long"); |
59 | SETARG_S(*jmp, offset); | 58 | SETARG_S(*jmp, offset); |
@@ -434,7 +433,6 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
434 | mode = iP; | 433 | mode = iP; |
435 | switch (o) { | 434 | switch (o) { |
436 | 435 | ||
437 | case OP_JMP: delta = 0; mode = iS; break; | ||
438 | case OP_CLOSURE: delta = -arg2+1; mode = iAB; break; | 436 | case OP_CLOSURE: delta = -arg2+1; mode = iAB; break; |
439 | case OP_SETLINE: mode = iU; break; | 437 | case OP_SETLINE: mode = iU; break; |
440 | case OP_CALL: mode = iAB; break; | 438 | case OP_CALL: mode = iAB; break; |
@@ -443,6 +441,10 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
443 | case OP_SETTABLE: delta = -arg2; mode = iAB; break; | 441 | case OP_SETTABLE: delta = -arg2; mode = iAB; break; |
444 | case OP_SETLIST: delta = -(arg2+1); mode = iAB; break; | 442 | case OP_SETLIST: delta = -(arg2+1); mode = iAB; break; |
445 | case OP_SETMAP: delta = -2*(arg1+1); mode = iU; break; | 443 | case OP_SETMAP: delta = -2*(arg1+1); mode = iU; break; |
444 | case OP_FORLOOP: delta = -3; arg1 = NO_JUMP; mode = iS; break; | ||
445 | |||
446 | case OP_FORPREP: arg1 = NO_JUMP; /* go through */ | ||
447 | case OP_JMP: mode = iS; break; | ||
446 | 448 | ||
447 | case OP_END: case OP_PUSHNILJMP: case OP_NOT: | 449 | case OP_END: case OP_PUSHNILJMP: case OP_NOT: |
448 | mode = iO; break; | 450 | mode = iO; break; |