diff options
| -rw-r--r-- | lopcodes.h | 30 | ||||
| -rw-r--r-- | lua.stx | 114 | ||||
| -rw-r--r-- | lvm.c | 85 |
3 files changed, 145 insertions, 84 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lopcodes.h,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $ | 2 | ** $Id: lopcodes.h,v 1.4 1997/09/22 20:53:20 roberto Exp roberto $ |
| 3 | ** Opcodes for Lua virtual machine | 3 | ** Opcodes for Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -29,10 +29,21 @@ PUSH2,/* - 2.0 */ | |||
| 29 | PUSHBYTE,/* b - (float)b */ | 29 | PUSHBYTE,/* b - (float)b */ |
| 30 | PUSHWORD,/* w - (float)w */ | 30 | PUSHWORD,/* w - (float)w */ |
| 31 | 31 | ||
| 32 | PUSHCONSTANT0,/* - CNST[0] */ | ||
| 33 | PUSHCONSTANT1,/* - CNST[1] */ | ||
| 34 | PUSHCONSTANT2,/* - CNST[2] */ | ||
| 35 | PUSHCONSTANT3,/* - CNST[3] */ | ||
| 36 | PUSHCONSTANT4,/* - CNST[4] */ | ||
| 37 | PUSHCONSTANT5,/* - CNST[5] */ | ||
| 38 | PUSHCONSTANT6,/* - CNST[6] */ | ||
| 39 | PUSHCONSTANT7,/* - CNST[7] */ | ||
| 40 | PUSHCONSTANT8,/* - CNST[8] */ | ||
| 41 | PUSHCONSTANT9,/* - CNST[9] */ | ||
| 32 | PUSHCONSTANTB,/*b - CNST[b] */ | 42 | PUSHCONSTANTB,/*b - CNST[b] */ |
| 33 | PUSHCONSTANT,/* w - CNST[w] */ | 43 | PUSHCONSTANT,/* w - CNST[w] */ |
| 34 | 44 | ||
| 35 | PUSHUPVALUE0, | 45 | PUSHUPVALUE0, |
| 46 | PUSHUPVALUE1, | ||
| 36 | PUSHUPVALUE,/* b - Closure[b] */ | 47 | PUSHUPVALUE,/* b - Closure[b] */ |
| 37 | 48 | ||
| 38 | PUSHLOCAL0,/* - LOC[0] */ | 49 | PUSHLOCAL0,/* - LOC[0] */ |
| @@ -47,6 +58,16 @@ PUSHLOCAL8,/* - LOC[8] */ | |||
| 47 | PUSHLOCAL9,/* - LOC[9] */ | 58 | PUSHLOCAL9,/* - LOC[9] */ |
| 48 | PUSHLOCAL,/* b - LOC[b] */ | 59 | PUSHLOCAL,/* b - LOC[b] */ |
| 49 | 60 | ||
| 61 | GETGLOBAL0,/* - VAR[CNST[0]] */ | ||
| 62 | GETGLOBAL1,/* - VAR[CNST[1]] */ | ||
| 63 | GETGLOBAL2,/* - VAR[CNST[2]] */ | ||
| 64 | GETGLOBAL3,/* - VAR[CNST[3]] */ | ||
| 65 | GETGLOBAL4,/* - VAR[CNST[4]] */ | ||
| 66 | GETGLOBAL5,/* - VAR[CNST[5]] */ | ||
| 67 | GETGLOBAL6,/* - VAR[CNST[6]] */ | ||
| 68 | GETGLOBAL7,/* - VAR[CNST[7]] */ | ||
| 69 | GETGLOBAL8,/* - VAR[CNST[8]] */ | ||
| 70 | GETGLOBAL9,/* - VAR[CNST[9]] */ | ||
| 50 | GETGLOBALB,/* b - VAR[CNST[b]] */ | 71 | GETGLOBALB,/* b - VAR[CNST[b]] */ |
| 51 | GETGLOBAL,/* w - VAR[CNST[w]] */ | 72 | GETGLOBAL,/* w - VAR[CNST[w]] */ |
| 52 | 73 | ||
| @@ -94,11 +115,14 @@ CONCOP,/* y x x..y */ | |||
| 94 | MINUSOP,/* x -x */ | 115 | MINUSOP,/* x -x */ |
| 95 | NOTOP,/* x (x==nil)? 1 : nil */ | 116 | NOTOP,/* x (x==nil)? 1 : nil */ |
| 96 | 117 | ||
| 97 | ONTJMP,/* w x (x!=nil)? x : - (x!=nil)? PC+=w */ | 118 | /* NOTICE: all jumps are relative to the position following the opcode */ |
| 98 | ONFJMP,/* w x (x==nil)? x : - (x==nil)? PC+=w */ | 119 | ONTJMP,/* b x (x!=nil)? x : - (x!=nil)? PC+=b */ |
| 120 | ONFJMP,/* b x (x==nil)? x : - (x==nil)? PC+=b */ | ||
| 99 | JMP,/* w - - PC+=w */ | 121 | JMP,/* w - - PC+=w */ |
| 122 | UPJMPB,/* b - - PC-=b */ | ||
| 100 | UPJMP,/* w - - PC-=w */ | 123 | UPJMP,/* w - - PC-=w */ |
| 101 | IFFJMP,/* w x - (x==nil)? PC+=w */ | 124 | IFFJMP,/* w x - (x==nil)? PC+=w */ |
| 125 | IFFUPJMPB,/* b x - (x==nil)? PC-=b */ | ||
| 102 | IFFUPJMP,/* w x - (x==nil)? PC-=w */ | 126 | IFFUPJMP,/* w x - (x==nil)? PC-=w */ |
| 103 | 127 | ||
| 104 | CLOSUREB,/* b v_1...v_n c(CNST[b]) */ | 128 | CLOSUREB,/* b v_1...v_n c(CNST[b]) */ |
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | /* | 2 | /* |
| 3 | ** $Id: lua.stx,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.4 1997/09/22 20:53:20 roberto Exp roberto $ |
| 4 | ** Syntax analizer and code generator | 4 | ** Syntax analizer and code generator |
| 5 | ** See Copyright Notice in lua.h | 5 | ** See Copyright Notice in lua.h |
| 6 | */ | 6 | */ |
| @@ -96,15 +96,24 @@ static void code_byte (Byte c) | |||
| 96 | 96 | ||
| 97 | static void code_word_at (int pc, int n) | 97 | static void code_word_at (int pc, int n) |
| 98 | { | 98 | { |
| 99 | Word w = n; | 99 | if (n > MAX_WORD) |
| 100 | if (w != n) | 100 | luaY_error("construction too big; unable to compile"); |
| 101 | luaY_error("block too big"); | ||
| 102 | currState->f->code[pc] = n&0xFF; | 101 | currState->f->code[pc] = n&0xFF; |
| 103 | currState->f->code[pc+1] = n>>8; | 102 | currState->f->code[pc+1] = n>>8; |
| 104 | } | 103 | } |
| 105 | 104 | ||
| 105 | |||
| 106 | static void fix_jump (int pc, OpCode op, int n) | ||
| 107 | { | ||
| 108 | currState->f->code[pc] = op; | ||
| 109 | code_word_at(pc+1, n); | ||
| 110 | } | ||
| 111 | |||
| 112 | |||
| 106 | static void code_word (int n) | 113 | static void code_word (int n) |
| 107 | { | 114 | { |
| 115 | if (n > MAX_WORD) | ||
| 116 | luaY_error("construction too big; unable to compile"); | ||
| 108 | code_byte(n&0xFF); | 117 | code_byte(n&0xFF); |
| 109 | code_byte(n>>8); | 118 | code_byte(n>>8); |
| 110 | } | 119 | } |
| @@ -128,16 +137,25 @@ static void code_opcode (OpCode op, int delta) | |||
| 128 | } | 137 | } |
| 129 | 138 | ||
| 130 | 139 | ||
| 131 | static void code_opborw(OpCode opbyte, int arg, int delta) | 140 | static void code_opb (OpCode opbyte, int arg, int delta) |
| 132 | { | 141 | { |
| 133 | if (arg <= 255) { | 142 | code_opcode(opbyte, delta); |
| 134 | code_opcode(opbyte, delta); | 143 | code_byte(arg); |
| 135 | code_byte(arg); | 144 | } |
| 136 | } | 145 | |
| 137 | else { | 146 | static void code_opw (OpCode opbyte, int arg, int delta) |
| 138 | code_opcode(opbyte+1, delta); | 147 | { |
| 139 | code_word(arg); | 148 | code_opcode(opbyte, delta); |
| 140 | } | 149 | code_word(arg); |
| 150 | } | ||
| 151 | |||
| 152 | |||
| 153 | static void code_opborw (OpCode opbyte, int arg, int delta) | ||
| 154 | { | ||
| 155 | if (arg <= 255) | ||
| 156 | code_opb(opbyte, arg, delta); | ||
| 157 | else | ||
| 158 | code_opw(opbyte+1, arg, delta); | ||
| 141 | } | 159 | } |
| 142 | 160 | ||
| 143 | 161 | ||
| @@ -167,7 +185,7 @@ static void code_pop (OpCode op) | |||
| 167 | 185 | ||
| 168 | static void code_constant (int c) | 186 | static void code_constant (int c) |
| 169 | { | 187 | { |
| 170 | code_opborw(PUSHCONSTANTB, c, 1); | 188 | code_oparg(PUSHCONSTANT0, PUSHCONSTANTB, c, 1); |
| 171 | } | 189 | } |
| 172 | 190 | ||
| 173 | 191 | ||
| @@ -235,9 +253,8 @@ static void code_number (real f) | |||
| 235 | 253 | ||
| 236 | static void flush_record (int n) | 254 | static void flush_record (int n) |
| 237 | { | 255 | { |
| 238 | if (n == 0) return; | 256 | if (n > 0) |
| 239 | code_opcode(SETMAP, -2*n); | 257 | code_opb(SETMAP, n, -2*n); |
| 240 | code_byte(n); | ||
| 241 | } | 258 | } |
| 242 | 259 | ||
| 243 | static void flush_list (int m, int n) | 260 | static void flush_list (int m, int n) |
| @@ -245,10 +262,8 @@ static void flush_list (int m, int n) | |||
| 245 | if (n == 0) return; | 262 | if (n == 0) return; |
| 246 | if (m == 0) | 263 | if (m == 0) |
| 247 | code_opcode(SETLIST0, -n); | 264 | code_opcode(SETLIST0, -n); |
| 248 | else if (m < 255) { | 265 | else if (m < 255) |
| 249 | code_opcode(SETLIST, -n); | 266 | code_opb(SETLIST, m, -n); |
| 250 | code_byte(m); | ||
| 251 | } | ||
| 252 | else | 267 | else |
| 253 | luaY_error("list constructor too long"); | 268 | luaY_error("list constructor too long"); |
| 254 | code_byte(n); | 269 | code_byte(n); |
| @@ -352,8 +367,7 @@ void luaY_codedebugline (int line) | |||
| 352 | { | 367 | { |
| 353 | static int lastline = 0; | 368 | static int lastline = 0; |
| 354 | if (lua_debug && line != lastline) { | 369 | if (lua_debug && line != lastline) { |
| 355 | code_neutralop(SETLINE); | 370 | code_opw(SETLINE, line, 0); |
| 356 | code_word(line); | ||
| 357 | lastline = line; | 371 | lastline = line; |
| 358 | } | 372 | } |
| 359 | } | 373 | } |
| @@ -399,13 +413,10 @@ static void adjust_mult_assign (int vars, long exps) | |||
| 399 | 413 | ||
| 400 | static void code_args (int dots) | 414 | static void code_args (int dots) |
| 401 | { | 415 | { |
| 402 | if (!dots) { | 416 | if (!dots) |
| 403 | code_opcode(ARGS, currState->nlocalvar); | 417 | code_opb(ARGS, currState->nlocalvar, currState->nlocalvar); |
| 404 | code_byte(currState->nlocalvar); | ||
| 405 | } | ||
| 406 | else { | 418 | else { |
| 407 | code_opcode(VARARGS, currState->nlocalvar+1); | 419 | code_opb(VARARGS, currState->nlocalvar, currState->nlocalvar+1); |
| 408 | code_byte(currState->nlocalvar); | ||
| 409 | add_localvar(luaS_new("arg")); | 420 | add_localvar(luaS_new("arg")); |
| 410 | } | 421 | } |
| 411 | } | 422 | } |
| @@ -414,7 +425,7 @@ static void code_args (int dots) | |||
| 414 | static void lua_pushvar (vardesc number) | 425 | static void lua_pushvar (vardesc number) |
| 415 | { | 426 | { |
| 416 | if (number > 0) /* global var */ | 427 | if (number > 0) /* global var */ |
| 417 | code_opborw(GETGLOBALB, number-1, 1); | 428 | code_oparg(GETGLOBAL0, GETGLOBALB, number-1, 1); |
| 418 | else if (number < 0) /* local var */ | 429 | else if (number < 0) /* local var */ |
| 419 | code_oparg(PUSHLOCAL0, PUSHLOCAL, (-number)-1, 1); | 430 | code_oparg(PUSHLOCAL0, PUSHLOCAL, (-number)-1, 1); |
| 420 | else | 431 | else |
| @@ -456,19 +467,19 @@ static void codeIf (int thenAdd, int elseAdd) | |||
| 456 | currState->pc -= sizeof(Word)+1; | 467 | currState->pc -= sizeof(Word)+1; |
| 457 | elseinit = currState->pc; | 468 | elseinit = currState->pc; |
| 458 | } | 469 | } |
| 459 | else { | 470 | else |
| 460 | currState->f->code[elseAdd] = JMP; | 471 | fix_jump(elseAdd, JMP, currState->pc-(elseAdd+1)); |
| 461 | code_word_at(elseAdd+1, currState->pc-elseinit); | 472 | fix_jump(thenAdd, IFFJMP, elseinit-(thenAdd+1)); |
| 462 | } | ||
| 463 | currState->f->code[thenAdd] = IFFJMP; | ||
| 464 | code_word_at(thenAdd+1, elseinit-(thenAdd+sizeof(Word)+1)); | ||
| 465 | } | 473 | } |
| 466 | 474 | ||
| 467 | 475 | ||
| 468 | static void code_shortcircuit (int pc, Byte jmp) | 476 | static void code_shortcircuit (OpCode op, int pos) |
| 469 | { | 477 | { |
| 470 | currState->f->code[pc] = jmp; | 478 | int dist = currState->pc - (pos+1); |
| 471 | code_word_at(pc+1, currState->pc - (pc + sizeof(Word)+1)); | 479 | if (dist > 255) |
| 480 | luaY_error("and/or expression too long"); | ||
| 481 | currState->f->code[pos] = op; | ||
| 482 | currState->f->code[pos+1] = dist; | ||
| 472 | } | 483 | } |
| 473 | 484 | ||
| 474 | 485 | ||
| @@ -582,7 +593,7 @@ TProtoFunc *luaY_parser (ZIO *z, char *chunkname) | |||
| 582 | %token <vReal> NUMBER | 593 | %token <vReal> NUMBER |
| 583 | %token <pTStr> NAME STRING | 594 | %token <pTStr> NAME STRING |
| 584 | 595 | ||
| 585 | %type <vInt> PrepJump, PrepJumpPop | 596 | %type <vInt> PrepJump, PrepJumpPop, PrepJumpSC |
| 586 | %type <vLong> exprlist, exprlist1 /* if > 0, points to function return | 597 | %type <vLong> exprlist, exprlist1 /* if > 0, points to function return |
| 587 | counter (which has list length); if <= 0, -list lenght */ | 598 | counter (which has list length); if <= 0, -list lenght */ |
| 588 | %type <vLong> functioncall, expr /* if != 0, points to function return | 599 | %type <vLong> functioncall, expr /* if != 0, points to function return |
| @@ -620,18 +631,15 @@ sc : /* empty */ | ';' ; | |||
| 620 | stat : IF expr1 THEN PrepJumpPop block PrepJump elsepart END | 631 | stat : IF expr1 THEN PrepJumpPop block PrepJump elsepart END |
| 621 | { codeIf($4, $6); } | 632 | { codeIf($4, $6); } |
| 622 | 633 | ||
| 623 | | WHILE {$<vInt>$=currState->pc;} expr1 DO PrepJumpPop block PrepJump END | 634 | | WHILE {$<vInt>$=currState->pc;} expr1 DO PrepJumpPop block END |
| 624 | { | 635 | { |
| 625 | currState->f->code[$5] = IFFJMP; | 636 | code_opborw(UPJMPB, currState->pc+1 - ($<vInt>2), 0); |
| 626 | code_word_at($5+1, currState->pc - ($5+sizeof(Word)+1)); | 637 | fix_jump($5, IFFJMP, currState->pc - ($5+1)); |
| 627 | currState->f->code[$7] = UPJMP; | ||
| 628 | code_word_at($7+1, currState->pc - ($<vInt>2)); | ||
| 629 | } | 638 | } |
| 630 | 639 | ||
| 631 | | REPEAT {$<vInt>$=currState->pc;} block UNTIL expr1 PrepJumpPop | 640 | | REPEAT {$<vInt>$=currState->pc;} block UNTIL expr1 |
| 632 | { | 641 | { |
| 633 | currState->f->code[$6] = IFFUPJMP; | 642 | code_opborw(IFFUPJMPB, currState->pc+1 - ($<vInt>2), -1); |
| 634 | code_word_at($6+1, currState->pc - ($<vInt>2)); | ||
| 635 | } | 643 | } |
| 636 | 644 | ||
| 637 | | varlist1 '=' exprlist1 | 645 | | varlist1 '=' exprlist1 |
| @@ -699,6 +707,10 @@ PrepJump : /* empty */ | |||
| 699 | } | 707 | } |
| 700 | ; | 708 | ; |
| 701 | 709 | ||
| 710 | PrepJumpSC : /* empty */ | ||
| 711 | { $$ = currState->pc; code_opcode(0, -1); code_byte(0); } | ||
| 712 | ; | ||
| 713 | |||
| 702 | PrepJumpPop : PrepJump { $$ = $1; deltastack(-1); /* pop condition */ } | 714 | PrepJumpPop : PrepJump { $$ = $1; deltastack(-1); /* pop condition */ } |
| 703 | ; | 715 | ; |
| 704 | 716 | ||
| @@ -726,13 +738,13 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 726 | | STRING { code_string($1); $$ = 0; } | 738 | | STRING { code_string($1); $$ = 0; } |
| 727 | | NIL {code_opcode(PUSHNIL, 1); $$ = 0; } | 739 | | NIL {code_opcode(PUSHNIL, 1); $$ = 0; } |
| 728 | | functioncall { $$ = $1; } | 740 | | functioncall { $$ = $1; } |
| 729 | | expr1 AND PrepJumpPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } | ||
| 730 | | expr1 OR PrepJumpPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } | ||
| 731 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } | 741 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } |
| 742 | | expr1 AND PrepJumpSC expr1 { code_shortcircuit(ONFJMP, $3); $$ = 0; } | ||
| 743 | | expr1 OR PrepJumpSC expr1 { code_shortcircuit(ONTJMP, $3); $$ = 0; } | ||
| 732 | ; | 744 | ; |
| 733 | 745 | ||
| 734 | table : | 746 | table : |
| 735 | { code_opcode(CREATEARRAY, 1); $<vInt>$ = currState->pc; code_word(0); } | 747 | { $<vInt>$ = currState->pc+1; code_opw(CREATEARRAY, 0, 1); } |
| 736 | '{' fieldlist '}' | 748 | '{' fieldlist '}' |
| 737 | { code_word_at($<vInt>1, $3); } | 749 | { code_word_at($<vInt>1, $3); } |
| 738 | ; | 750 | ; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.4 1997/09/22 20:53:20 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -22,9 +22,9 @@ | |||
| 22 | #include "lvm.h" | 22 | #include "lvm.h" |
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | #define get_prevword(pc) (*(pc-2)+(*(pc-1)<<8)) | 25 | #define skip_word(pc) (pc+=2) |
| 26 | #define get_word(pc) (pc+=2, get_prevword(pc)) | 26 | #define get_word(pc) (*(pc)+(*((pc)+1)<<8)) |
| 27 | #define skip_word(pc) {pc+=2;} | 27 | #define next_word(pc) (pc+=2, get_word(pc-2)) |
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ | 30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ |
| @@ -300,7 +300,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 300 | aux = *pc++; goto pushnumber; | 300 | aux = *pc++; goto pushnumber; |
| 301 | 301 | ||
| 302 | case PUSHWORD: | 302 | case PUSHWORD: |
| 303 | aux = get_word(pc); goto pushnumber; | 303 | aux = next_word(pc); goto pushnumber; |
| 304 | 304 | ||
| 305 | case PUSH0: case PUSH1: case PUSH2: | 305 | case PUSH0: case PUSH1: case PUSH2: |
| 306 | aux -= PUSH0; | 306 | aux -= PUSH0; |
| @@ -323,10 +323,16 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 323 | break; | 323 | break; |
| 324 | 324 | ||
| 325 | case GETGLOBAL: | 325 | case GETGLOBAL: |
| 326 | aux = get_word(pc); goto getglobal; | 326 | aux = next_word(pc); goto getglobal; |
| 327 | 327 | ||
| 328 | case GETGLOBALB: | 328 | case GETGLOBALB: |
| 329 | aux = *pc++; | 329 | aux = *pc++; goto getglobal; |
| 330 | |||
| 331 | case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2: | ||
| 332 | case GETGLOBAL3: case GETGLOBAL4: case GETGLOBAL5: | ||
| 333 | case GETGLOBAL6: case GETGLOBAL7: case GETGLOBAL8: | ||
| 334 | case GETGLOBAL9: | ||
| 335 | aux -= GETGLOBAL0; | ||
| 330 | getglobal: | 336 | getglobal: |
| 331 | luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | 337 | luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); |
| 332 | break; | 338 | break; |
| @@ -336,7 +342,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 336 | break; | 342 | break; |
| 337 | 343 | ||
| 338 | case PUSHSELF: | 344 | case PUSHSELF: |
| 339 | aux = get_word(pc); goto pushself; | 345 | aux = next_word(pc); goto pushself; |
| 340 | 346 | ||
| 341 | case PUSHSELFB: | 347 | case PUSHSELFB: |
| 342 | aux = *pc++; | 348 | aux = *pc++; |
| @@ -349,10 +355,16 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 349 | } | 355 | } |
| 350 | 356 | ||
| 351 | case PUSHCONSTANT: | 357 | case PUSHCONSTANT: |
| 352 | aux = get_word(pc); goto pushconstant; | 358 | aux = next_word(pc); goto pushconstant; |
| 353 | 359 | ||
| 354 | case PUSHCONSTANTB: | 360 | case PUSHCONSTANTB: |
| 355 | aux = *pc++; | 361 | aux = *pc++; goto pushconstant; |
| 362 | |||
| 363 | case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2: | ||
| 364 | case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5: | ||
| 365 | case PUSHCONSTANT6: case PUSHCONSTANT7: case PUSHCONSTANT8: | ||
| 366 | case PUSHCONSTANT9: | ||
| 367 | aux -= PUSHCONSTANT0; | ||
| 356 | pushconstant: | 368 | pushconstant: |
| 357 | *luaD_stack.top++ = consts[aux]; | 369 | *luaD_stack.top++ = consts[aux]; |
| 358 | break; | 370 | break; |
| @@ -360,8 +372,8 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 360 | case PUSHUPVALUE: | 372 | case PUSHUPVALUE: |
| 361 | aux = *pc++; goto pushupvalue; | 373 | aux = *pc++; goto pushupvalue; |
| 362 | 374 | ||
| 363 | case PUSHUPVALUE0: | 375 | case PUSHUPVALUE0: case PUSHUPVALUE1: |
| 364 | aux = 0; | 376 | aux -= PUSHUPVALUE0; |
| 365 | pushupvalue: | 377 | pushupvalue: |
| 366 | *luaD_stack.top++ = cl->consts[aux+1]; | 378 | *luaD_stack.top++ = cl->consts[aux+1]; |
| 367 | break; | 379 | break; |
| @@ -379,7 +391,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 379 | break; | 391 | break; |
| 380 | 392 | ||
| 381 | case SETGLOBAL: | 393 | case SETGLOBAL: |
| 382 | aux = get_word(pc); goto setglobal; | 394 | aux = next_word(pc); goto setglobal; |
| 383 | 395 | ||
| 384 | case SETGLOBALB: | 396 | case SETGLOBALB: |
| 385 | aux = *pc++; | 397 | aux = *pc++; |
| @@ -442,7 +454,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 442 | 454 | ||
| 443 | case CREATEARRAY: | 455 | case CREATEARRAY: |
| 444 | luaC_checkGC(); | 456 | luaC_checkGC(); |
| 445 | avalue(luaD_stack.top) = luaH_new(get_word(pc)); | 457 | avalue(luaD_stack.top) = luaH_new(next_word(pc)); |
| 446 | ttype(luaD_stack.top) = LUA_T_ARRAY; | 458 | ttype(luaD_stack.top) = LUA_T_ARRAY; |
| 447 | luaD_stack.top++; | 459 | luaD_stack.top++; |
| 448 | break; | 460 | break; |
| @@ -554,45 +566,58 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 554 | break; | 566 | break; |
| 555 | 567 | ||
| 556 | case ONTJMP: | 568 | case ONTJMP: |
| 557 | skip_word(pc); | ||
| 558 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) | 569 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) |
| 559 | pc += get_prevword(pc); | 570 | pc += *pc; |
| 560 | else | 571 | else { |
| 572 | pc++; | ||
| 561 | luaD_stack.top--; | 573 | luaD_stack.top--; |
| 574 | } | ||
| 562 | break; | 575 | break; |
| 563 | 576 | ||
| 564 | case ONFJMP: | 577 | case ONFJMP: |
| 565 | skip_word(pc); | ||
| 566 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) | 578 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) |
| 567 | pc += get_prevword(pc); | 579 | pc += *pc; |
| 568 | else | 580 | else { |
| 581 | pc++; | ||
| 569 | luaD_stack.top--; | 582 | luaD_stack.top--; |
| 583 | } | ||
| 570 | break; | 584 | break; |
| 571 | 585 | ||
| 572 | case JMP: | 586 | case JMP: |
| 573 | skip_word(pc); | 587 | pc += get_word(pc); |
| 574 | pc += get_prevword(pc); | 588 | break; |
| 589 | |||
| 590 | case UPJMPB: | ||
| 591 | pc -= *pc; | ||
| 575 | break; | 592 | break; |
| 576 | 593 | ||
| 577 | case UPJMP: | 594 | case UPJMP: |
| 578 | skip_word(pc); | 595 | pc -= get_word(pc); |
| 579 | pc -= get_prevword(pc); | ||
| 580 | break; | 596 | break; |
| 581 | 597 | ||
| 582 | case IFFJMP: | 598 | case IFFJMP: |
| 583 | skip_word(pc); | ||
| 584 | if (ttype(--luaD_stack.top) == LUA_T_NIL) | 599 | if (ttype(--luaD_stack.top) == LUA_T_NIL) |
| 585 | pc += get_prevword(pc); | 600 | pc += get_word(pc); |
| 601 | else | ||
| 602 | skip_word(pc); | ||
| 603 | break; | ||
| 604 | |||
| 605 | case IFFUPJMPB: | ||
| 606 | if (ttype(--luaD_stack.top) == LUA_T_NIL) | ||
| 607 | pc -= *pc; | ||
| 608 | else | ||
| 609 | pc++; | ||
| 586 | break; | 610 | break; |
| 587 | 611 | ||
| 588 | case IFFUPJMP: | 612 | case IFFUPJMP: |
| 589 | skip_word(pc); | ||
| 590 | if (ttype(--luaD_stack.top) == LUA_T_NIL) | 613 | if (ttype(--luaD_stack.top) == LUA_T_NIL) |
| 591 | pc -= get_prevword(pc); | 614 | pc -= get_word(pc); |
| 615 | else | ||
| 616 | skip_word(pc); | ||
| 592 | break; | 617 | break; |
| 593 | 618 | ||
| 594 | case CLOSURE: | 619 | case CLOSURE: |
| 595 | aux = get_word(pc); goto closure; | 620 | aux = next_word(pc); goto closure; |
| 596 | 621 | ||
| 597 | case CLOSUREB: | 622 | case CLOSUREB: |
| 598 | aux = *pc++; | 623 | aux = *pc++; |
| @@ -617,7 +642,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 617 | return (base + ((aux==RETCODE) ? *pc : 0)); | 642 | return (base + ((aux==RETCODE) ? *pc : 0)); |
| 618 | 643 | ||
| 619 | case SETLINE: { | 644 | case SETLINE: { |
| 620 | int line = get_word(pc); | 645 | int line = next_word(pc); |
| 621 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { | 646 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { |
| 622 | /* open space for LINE value */ | 647 | /* open space for LINE value */ |
| 623 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); | 648 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); |
