diff options
| -rw-r--r-- | lopcodes.h | 31 | ||||
| -rw-r--r-- | lua.stx | 180 | ||||
| -rw-r--r-- | lvm.c | 126 |
3 files changed, 160 insertions, 177 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lopcodes.h,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ | 2 | ** $Id: lopcodes.h,v 1.3 1997/09/19 21:17:52 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 | */ |
| @@ -8,6 +8,13 @@ | |||
| 8 | #define lopcodes_h | 8 | #define lopcodes_h |
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | /* | ||
| 12 | ** NOTICE: variants of the same opcode (like PUSH0, PUSHBYTE, PUSHWORD) must | ||
| 13 | ** be consecutive: First, those with built-in parameters, then with byte | ||
| 14 | ** parameter and last with word parameter. | ||
| 15 | */ | ||
| 16 | |||
| 17 | |||
| 11 | typedef enum { | 18 | typedef enum { |
| 12 | /* name parm before after side effect | 19 | /* name parm before after side effect |
| 13 | -----------------------------------------------------------------------------*/ | 20 | -----------------------------------------------------------------------------*/ |
| @@ -15,15 +22,19 @@ ENDCODE, | |||
| 15 | 22 | ||
| 16 | PUSHNIL,/* - nil */ | 23 | PUSHNIL,/* - nil */ |
| 17 | PUSHNILS,/* b - nil_1...nil_b */ | 24 | PUSHNILS,/* b - nil_1...nil_b */ |
| 25 | |||
| 18 | PUSH0,/* - 0.0 */ | 26 | PUSH0,/* - 0.0 */ |
| 19 | PUSH1,/* - 1.0 */ | 27 | PUSH1,/* - 1.0 */ |
| 20 | PUSH2,/* - 2.0 */ | 28 | PUSH2,/* - 2.0 */ |
| 21 | PUSHBYTE,/* b - (float)b */ | 29 | PUSHBYTE,/* b - (float)b */ |
| 22 | PUSHWORD,/* w - (float)w */ | 30 | PUSHWORD,/* w - (float)w */ |
| 31 | |||
| 23 | PUSHCONSTANTB,/*b - CNST[b] */ | 32 | PUSHCONSTANTB,/*b - CNST[b] */ |
| 24 | PUSHCONSTANT,/* w - CNST[w] */ | 33 | PUSHCONSTANT,/* w - CNST[w] */ |
| 34 | |||
| 25 | PUSHUPVALUE0, | 35 | PUSHUPVALUE0, |
| 26 | PUSHUPVALUE,/* b - Closure[b] */ | 36 | PUSHUPVALUE,/* b - Closure[b] */ |
| 37 | |||
| 27 | PUSHLOCAL0,/* - LOC[0] */ | 38 | PUSHLOCAL0,/* - LOC[0] */ |
| 28 | PUSHLOCAL1,/* - LOC[1] */ | 39 | PUSHLOCAL1,/* - LOC[1] */ |
| 29 | PUSHLOCAL2,/* - LOC[2] */ | 40 | PUSHLOCAL2,/* - LOC[2] */ |
| @@ -35,10 +46,15 @@ PUSHLOCAL7,/* - LOC[7] */ | |||
| 35 | PUSHLOCAL8,/* - LOC[8] */ | 46 | PUSHLOCAL8,/* - LOC[8] */ |
| 36 | PUSHLOCAL9,/* - LOC[9] */ | 47 | PUSHLOCAL9,/* - LOC[9] */ |
| 37 | PUSHLOCAL,/* b - LOC[b] */ | 48 | PUSHLOCAL,/* b - LOC[b] */ |
| 38 | PUSHGLOBALB,/* b - VAR[CNST[b]] */ | 49 | |
| 39 | PUSHGLOBAL,/* w - VAR[CNST[w]] */ | 50 | GETGLOBALB,/* b - VAR[CNST[b]] */ |
| 51 | GETGLOBAL,/* w - VAR[CNST[w]] */ | ||
| 52 | |||
| 40 | GETTABLE,/* i t t[i] */ | 53 | GETTABLE,/* i t t[i] */ |
| 54 | |||
| 55 | PUSHSELFB,/* b t t t[CNST[b]] */ | ||
| 41 | PUSHSELF,/* w t t t[CNST[w]] */ | 56 | PUSHSELF,/* w t t t[CNST[w]] */ |
| 57 | |||
| 42 | CREATEARRAY,/* w - newarray(size = w) */ | 58 | CREATEARRAY,/* w - newarray(size = w) */ |
| 43 | 59 | ||
| 44 | SETLOCAL0,/* x - LOC[0]=x */ | 60 | SETLOCAL0,/* x - LOC[0]=x */ |
| @@ -52,10 +68,13 @@ SETLOCAL7,/* x - LOC[7]=x */ | |||
| 52 | SETLOCAL8,/* x - LOC[8]=x */ | 68 | SETLOCAL8,/* x - LOC[8]=x */ |
| 53 | SETLOCAL9,/* x - LOC[9]=x */ | 69 | SETLOCAL9,/* x - LOC[9]=x */ |
| 54 | SETLOCAL,/* b x - LOC[b]=x */ | 70 | SETLOCAL,/* b x - LOC[b]=x */ |
| 71 | |||
| 55 | SETGLOBALB,/* b x - VAR[CNST[b]]=x */ | 72 | SETGLOBALB,/* b x - VAR[CNST[b]]=x */ |
| 56 | SETGLOBAL,/* w x - VAR[CNST[w]]=x */ | 73 | SETGLOBAL,/* w x - VAR[CNST[w]]=x */ |
| 74 | |||
| 57 | SETTABLE0,/* v i t - t[i]=v */ | 75 | SETTABLE0,/* v i t - t[i]=v */ |
| 58 | SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ | 76 | SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ |
| 77 | |||
| 59 | SETLIST0,/* b v_b...v_1 t - t[i]=v_i */ | 78 | SETLIST0,/* b v_b...v_1 t - t[i]=v_i */ |
| 60 | SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ | 79 | SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ |
| 61 | SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */ | 80 | SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */ |
| @@ -82,10 +101,14 @@ UPJMP,/* w - - PC-=w */ | |||
| 82 | IFFJMP,/* w x - (x==nil)? PC+=w */ | 101 | IFFJMP,/* w x - (x==nil)? PC+=w */ |
| 83 | IFFUPJMP,/* w x - (x==nil)? PC-=w */ | 102 | IFFUPJMP,/* w x - (x==nil)? PC-=w */ |
| 84 | 103 | ||
| 85 | CLOSURE,/* f v_1...v_n c(f) */ | 104 | CLOSUREB,/* b v_1...v_n c(CNST[b]) */ |
| 105 | CLOSURE,/* w v_1...v_n c(CNST[w]) */ | ||
| 106 | |||
| 86 | CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ | 107 | CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ |
| 87 | RETCODE,/* b - - */ | 108 | RETCODE,/* b - - */ |
| 88 | SETLINE,/* w - - LINE=w */ | 109 | SETLINE,/* w - - LINE=w */ |
| 110 | POP1,/* - - TOP-=1 */ | ||
| 111 | POP2,/* - - TOP-=2 */ | ||
| 89 | POPS,/* b - - TOP-=b */ | 112 | POPS,/* b - - TOP-=b */ |
| 90 | ARGS,/* b - - TOP=BASE+b */ | 113 | ARGS,/* b - - TOP=BASE+b */ |
| 91 | VARARGS/* b v_x...v_1 {v_1...v_x;n=x} TOP=BASE+b+1 */ | 114 | VARARGS/* b v_x...v_1 {v_1...v_x;n=x} TOP=BASE+b+1 */ |
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | /* | 2 | /* |
| 3 | ** $Id: lua.stx,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.3 1997/09/19 21:17:52 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 | */ |
| @@ -94,6 +94,22 @@ static void code_byte (Byte c) | |||
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | 96 | ||
| 97 | static void code_word_at (int pc, int n) | ||
| 98 | { | ||
| 99 | Word w = n; | ||
| 100 | if (w != n) | ||
| 101 | luaY_error("block too big"); | ||
| 102 | currState->f->code[pc] = n&0xFF; | ||
| 103 | currState->f->code[pc+1] = n>>8; | ||
| 104 | } | ||
| 105 | |||
| 106 | static void code_word (int n) | ||
| 107 | { | ||
| 108 | code_byte(n&0xFF); | ||
| 109 | code_byte(n>>8); | ||
| 110 | } | ||
| 111 | |||
| 112 | |||
| 97 | static void deltastack (int delta) | 113 | static void deltastack (int delta) |
| 98 | { | 114 | { |
| 99 | currState->stacksize += delta; | 115 | currState->stacksize += delta; |
| @@ -112,9 +128,25 @@ static void code_opcode (OpCode op, int delta) | |||
| 112 | } | 128 | } |
| 113 | 129 | ||
| 114 | 130 | ||
| 115 | static void code_push (OpCode op) | 131 | static void code_opborw(OpCode opbyte, int arg, int delta) |
| 116 | { | 132 | { |
| 117 | code_opcode(op, 1); | 133 | if (arg <= 255) { |
| 134 | code_opcode(opbyte, delta); | ||
| 135 | code_byte(arg); | ||
| 136 | } | ||
| 137 | else { | ||
| 138 | code_opcode(opbyte+1, delta); | ||
| 139 | code_word(arg); | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | |||
| 144 | static void code_oparg (OpCode firstop, OpCode opbyte, int arg, int delta) | ||
| 145 | { | ||
| 146 | if (firstop+arg < opbyte) | ||
| 147 | code_opcode(firstop+arg, delta); | ||
| 148 | else | ||
| 149 | code_opborw(opbyte, arg, delta); | ||
| 118 | } | 150 | } |
| 119 | 151 | ||
| 120 | 152 | ||
| @@ -133,31 +165,9 @@ static void code_pop (OpCode op) | |||
| 133 | #define code_unop(op) code_neutralop(op) | 165 | #define code_unop(op) code_neutralop(op) |
| 134 | 166 | ||
| 135 | 167 | ||
| 136 | static void code_word_at (int pc, int n) | ||
| 137 | { | ||
| 138 | Word w = n; | ||
| 139 | if (w != n) | ||
| 140 | luaY_error("block too big"); | ||
| 141 | currState->f->code[pc] = n&0xFF; | ||
| 142 | currState->f->code[pc+1] = n>>8; | ||
| 143 | } | ||
| 144 | |||
| 145 | static void code_word (int n) | ||
| 146 | { | ||
| 147 | code_byte(n&0xFF); | ||
| 148 | code_byte(n>>8); | ||
| 149 | } | ||
| 150 | |||
| 151 | static void code_constant (int c) | 168 | static void code_constant (int c) |
| 152 | { | 169 | { |
| 153 | if (c <= 255) { | 170 | code_opborw(PUSHCONSTANTB, c, 1); |
| 154 | code_push(PUSHCONSTANTB); | ||
| 155 | code_byte(c); | ||
| 156 | } | ||
| 157 | else { | ||
| 158 | code_push(PUSHCONSTANT); | ||
| 159 | code_word(c); | ||
| 160 | } | ||
| 161 | } | 171 | } |
| 162 | 172 | ||
| 163 | 173 | ||
| @@ -216,18 +226,8 @@ static int real_constant (real r) | |||
| 216 | static void code_number (real f) | 226 | static void code_number (real f) |
| 217 | { | 227 | { |
| 218 | Word i; | 228 | Word i; |
| 219 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) { | 229 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) |
| 220 | /* f has an (short) integer value */ | 230 | code_oparg(PUSH0, PUSHBYTE, i, 1); /* f has an (short) integer value */ |
| 221 | if (i <= 2) code_push(PUSH0 + i); | ||
| 222 | else if (i <= 255) { | ||
| 223 | code_push(PUSHBYTE); | ||
| 224 | code_byte(i); | ||
| 225 | } | ||
| 226 | else { | ||
| 227 | code_push(PUSHWORD); | ||
| 228 | code_word(i); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | else | 231 | else |
| 232 | code_constant(real_constant(f)); | 232 | code_constant(real_constant(f)); |
| 233 | } | 233 | } |
| @@ -344,12 +344,7 @@ static void pushupvalue (TaggedString *n) | |||
| 344 | if (aux_localname(n, currState) >= 0) | 344 | if (aux_localname(n, currState) >= 0) |
| 345 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); | 345 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); |
| 346 | i = indexupvalue(n); | 346 | i = indexupvalue(n); |
| 347 | if (i == 0) | 347 | code_oparg(PUSHUPVALUE0, PUSHUPVALUE, i, 1); |
| 348 | code_push(PUSHUPVALUE0); | ||
| 349 | else { | ||
| 350 | code_push(PUSHUPVALUE); | ||
| 351 | code_byte(i); | ||
| 352 | } | ||
| 353 | } | 348 | } |
| 354 | 349 | ||
| 355 | 350 | ||
| @@ -366,18 +361,10 @@ void luaY_codedebugline (int line) | |||
| 366 | 361 | ||
| 367 | static void adjuststack (int n) | 362 | static void adjuststack (int n) |
| 368 | { | 363 | { |
| 369 | if (n > 0) { | 364 | if (n > 0) |
| 370 | code_opcode(POPS, -n); | 365 | code_oparg(POP1-1, POPS, n, -n); /* POP1-1 = POP0 */ |
| 371 | code_byte(n); | 366 | else if (n < 0) |
| 372 | } | 367 | code_oparg(PUSHNIL-1, PUSHNILS, -n, -n); /* PUSHNIL1-1 = PUSHNIL0 */ |
| 373 | else if (n < 0) { | ||
| 374 | if (n == -1) | ||
| 375 | code_push(PUSHNIL); | ||
| 376 | else { | ||
| 377 | code_opcode(PUSHNILS, -n); | ||
| 378 | code_byte(-n); | ||
| 379 | } | ||
| 380 | } | ||
| 381 | } | 368 | } |
| 382 | 369 | ||
| 383 | 370 | ||
| @@ -426,29 +413,12 @@ static void code_args (int dots) | |||
| 426 | 413 | ||
| 427 | static void lua_pushvar (vardesc number) | 414 | static void lua_pushvar (vardesc number) |
| 428 | { | 415 | { |
| 429 | if (number > 0) { /* global var */ | 416 | if (number > 0) /* global var */ |
| 430 | number--; | 417 | code_opborw(GETGLOBALB, number-1, 1); |
| 431 | if (number <= 255) { | 418 | else if (number < 0) /* local var */ |
| 432 | code_push(PUSHGLOBALB); | 419 | code_oparg(PUSHLOCAL0, PUSHLOCAL, (-number)-1, 1); |
| 433 | code_byte(number); | 420 | else |
| 434 | } | ||
| 435 | else { | ||
| 436 | code_push(PUSHGLOBAL); | ||
| 437 | code_word(number); | ||
| 438 | } | ||
| 439 | } | ||
| 440 | else if (number < 0) { /* local var */ | ||
| 441 | number = (-number) - 1; | ||
| 442 | if (number < 10) | ||
| 443 | code_push(PUSHLOCAL0 + number); | ||
| 444 | else { | ||
| 445 | code_push(PUSHLOCAL); | ||
| 446 | code_byte(number); | ||
| 447 | } | ||
| 448 | } | ||
| 449 | else { | ||
| 450 | code_pop(GETTABLE); | 421 | code_pop(GETTABLE); |
| 451 | } | ||
| 452 | } | 422 | } |
| 453 | 423 | ||
| 454 | 424 | ||
| @@ -456,26 +426,10 @@ static void storevar (vardesc number) | |||
| 456 | { | 426 | { |
| 457 | if (number == 0) /* indexed var */ | 427 | if (number == 0) /* indexed var */ |
| 458 | code_opcode(SETTABLE0, -3); | 428 | code_opcode(SETTABLE0, -3); |
| 459 | else if (number > 0) { /* global var */ | 429 | else if (number > 0) /* global var */ |
| 460 | number--; | 430 | code_opborw(SETGLOBALB, number-1, -1); |
| 461 | if (number <= 255) { | 431 | else /* number < 0 - local var */ |
| 462 | code_pop(SETGLOBALB); | 432 | code_oparg(SETLOCAL0, SETLOCAL, (-number)-1, -1); |
| 463 | code_byte(number); | ||
| 464 | } | ||
| 465 | else { | ||
| 466 | code_pop(SETGLOBAL); | ||
| 467 | code_word(number); | ||
| 468 | } | ||
| 469 | } | ||
| 470 | else { /* number < 0 - local var */ | ||
| 471 | number = (-number) - 1; | ||
| 472 | if (number < 10) | ||
| 473 | code_pop(SETLOCAL0 + number); | ||
| 474 | else { | ||
| 475 | code_pop(SETLOCAL); | ||
| 476 | code_byte(number); | ||
| 477 | } | ||
| 478 | } | ||
| 479 | } | 433 | } |
| 480 | 434 | ||
| 481 | 435 | ||
| @@ -535,8 +489,7 @@ static void func_onstack (TProtoFunc *f) | |||
| 535 | currState->f->consts[c].value.tf = (currState+1)->f; | 489 | currState->f->consts[c].value.tf = (currState+1)->f; |
| 536 | for (i=0; i<nupvalues; i++) | 490 | for (i=0; i<nupvalues; i++) |
| 537 | lua_pushvar((currState+1)->upvalues[i]); | 491 | lua_pushvar((currState+1)->upvalues[i]); |
| 538 | code_constant(c); | 492 | code_opborw(CLOSUREB, c, 1-nupvalues); |
| 539 | code_opcode(CLOSURE, -nupvalues); | ||
| 540 | } | 493 | } |
| 541 | 494 | ||
| 542 | 495 | ||
| @@ -771,7 +724,7 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 771 | | varexp { $$ = 0;} | 724 | | varexp { $$ = 0;} |
| 772 | | NUMBER { code_number($1); $$ = 0; } | 725 | | NUMBER { code_number($1); $$ = 0; } |
| 773 | | STRING { code_string($1); $$ = 0; } | 726 | | STRING { code_string($1); $$ = 0; } |
| 774 | | NIL {code_push(PUSHNIL); $$ = 0; } | 727 | | NIL {code_opcode(PUSHNIL, 1); $$ = 0; } |
| 775 | | functioncall { $$ = $1; } | 728 | | functioncall { $$ = $1; } |
| 776 | | expr1 AND PrepJumpPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } | 729 | | expr1 AND PrepJumpPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } |
| 777 | | expr1 OR PrepJumpPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } | 730 | | expr1 OR PrepJumpPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } |
| @@ -779,14 +732,9 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 779 | ; | 732 | ; |
| 780 | 733 | ||
| 781 | table : | 734 | table : |
| 782 | { | 735 | { code_opcode(CREATEARRAY, 1); $<vInt>$ = currState->pc; code_word(0); } |
| 783 | code_push(CREATEARRAY); | 736 | '{' fieldlist '}' |
| 784 | $<vInt>$ = currState->pc; code_word(0); | 737 | { code_word_at($<vInt>1, $3); } |
| 785 | } | ||
| 786 | '{' fieldlist '}' | ||
| 787 | { | ||
| 788 | code_word_at($<vInt>1, $3); | ||
| 789 | } | ||
| 790 | ; | 738 | ; |
| 791 | 739 | ||
| 792 | functioncall : funcvalue funcParams | 740 | functioncall : funcvalue funcParams |
| @@ -801,8 +749,7 @@ functioncall : funcvalue funcParams | |||
| 801 | funcvalue : varexp { $$ = 0; } | 749 | funcvalue : varexp { $$ = 0; } |
| 802 | | varexp ':' NAME | 750 | | varexp ':' NAME |
| 803 | { | 751 | { |
| 804 | code_push(PUSHSELF); | 752 | code_opborw(PUSHSELFB, string_constant($3, currState), 1); |
| 805 | code_word(string_constant($3, currState)); | ||
| 806 | $$ = 1; | 753 | $$ = 1; |
| 807 | } | 754 | } |
| 808 | ; | 755 | ; |
| @@ -909,15 +856,8 @@ varlist1 : var | |||
| 909 | ; | 856 | ; |
| 910 | 857 | ||
| 911 | var : singlevar { $$ = $1; } | 858 | var : singlevar { $$ = $1; } |
| 912 | | varexp '[' expr1 ']' | 859 | | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ |
| 913 | { | 860 | | varexp '.' NAME { code_string($3); $$ = 0; }/* ind. var. */ |
| 914 | $$ = 0; /* indexed variable */ | ||
| 915 | } | ||
| 916 | | varexp '.' NAME | ||
| 917 | { | ||
| 918 | code_string($3); | ||
| 919 | $$ = 0; /* indexed variable */ | ||
| 920 | } | ||
| 921 | ; | 861 | ; |
| 922 | 862 | ||
| 923 | singlevar : NAME { $$ = singlevar($1, currState); } | 863 | singlevar : NAME { $$ = singlevar($1, currState); } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 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 | */ |
| @@ -28,7 +28,7 @@ | |||
| 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), ... */ |
| 31 | #define EXTRA_STACK 4 | 31 | #define EXTRA_STACK 5 |
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | 34 | ||
| @@ -276,14 +276,14 @@ static void adjust_varargs (StkId first_extra_arg) | |||
| 276 | */ | 276 | */ |
| 277 | StkId luaV_execute (Closure *cl, StkId base) | 277 | StkId luaV_execute (Closure *cl, StkId base) |
| 278 | { | 278 | { |
| 279 | TProtoFunc *func = cl->consts[0].value.tf; | 279 | Byte *pc = cl->consts[0].value.tf->code; |
| 280 | Byte *pc = func->code; | 280 | TObject *consts = cl->consts[0].value.tf->consts; |
| 281 | if (lua_callhook) | 281 | if (lua_callhook) |
| 282 | luaD_callHook(base, LUA_T_MARK, 0); | 282 | luaD_callHook(base, LUA_T_MARK, 0); |
| 283 | luaD_checkstack((*pc++)+EXTRA_STACK); | 283 | luaD_checkstack((*pc++)+EXTRA_STACK); |
| 284 | while (1) { | 284 | while (1) { |
| 285 | OpCode opcode; | 285 | int aux; |
| 286 | switch (opcode = (OpCode)*pc++) { | 286 | switch ((OpCode)(aux = *pc++)) { |
| 287 | 287 | ||
| 288 | case PUSHNIL: | 288 | case PUSHNIL: |
| 289 | ttype(luaD_stack.top++) = LUA_T_NIL; | 289 | ttype(luaD_stack.top++) = LUA_T_NIL; |
| @@ -296,89 +296,95 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 296 | break; | 296 | break; |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | case PUSH0: case PUSH1: case PUSH2: | ||
| 300 | ttype(luaD_stack.top) = LUA_T_NUMBER; | ||
| 301 | nvalue(luaD_stack.top) = opcode-PUSH0; | ||
| 302 | luaD_stack.top++; | ||
| 303 | break; | ||
| 304 | |||
| 305 | case PUSHBYTE: | 299 | case PUSHBYTE: |
| 306 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 300 | aux = *pc++; goto pushnumber; |
| 307 | nvalue(luaD_stack.top) = *pc++; | ||
| 308 | luaD_stack.top++; | ||
| 309 | break; | ||
| 310 | 301 | ||
| 311 | case PUSHWORD: | 302 | case PUSHWORD: |
| 303 | aux = get_word(pc); goto pushnumber; | ||
| 304 | |||
| 305 | case PUSH0: case PUSH1: case PUSH2: | ||
| 306 | aux -= PUSH0; | ||
| 307 | pushnumber: | ||
| 312 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 308 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
| 313 | nvalue(luaD_stack.top) = get_word(pc); | 309 | nvalue(luaD_stack.top) = aux; |
| 314 | luaD_stack.top++; | 310 | luaD_stack.top++; |
| 315 | break; | 311 | break; |
| 316 | 312 | ||
| 313 | case PUSHLOCAL: | ||
| 314 | aux = *pc++; goto pushlocal; | ||
| 315 | |||
| 317 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: | 316 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: |
| 318 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: | 317 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: |
| 319 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: | 318 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: |
| 320 | case PUSHLOCAL9: | 319 | case PUSHLOCAL9: |
| 321 | *luaD_stack.top++ = | 320 | aux -= PUSHLOCAL0; |
| 322 | *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); | 321 | pushlocal: |
| 323 | break; | 322 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); |
| 324 | |||
| 325 | case PUSHLOCAL: | ||
| 326 | *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++)); | ||
| 327 | break; | 323 | break; |
| 328 | 324 | ||
| 329 | case PUSHGLOBALB: | 325 | case GETGLOBAL: |
| 330 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 326 | aux = get_word(pc); goto getglobal; |
| 331 | break; | ||
| 332 | 327 | ||
| 333 | case PUSHGLOBAL: | 328 | case GETGLOBALB: |
| 334 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | 329 | aux = *pc++; |
| 330 | getglobal: | ||
| 331 | luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | ||
| 335 | break; | 332 | break; |
| 336 | 333 | ||
| 337 | case GETTABLE: | 334 | case GETTABLE: |
| 338 | luaV_gettable(); | 335 | luaV_gettable(); |
| 339 | break; | 336 | break; |
| 340 | 337 | ||
| 341 | case PUSHSELF: { | 338 | case PUSHSELF: |
| 339 | aux = get_word(pc); goto pushself; | ||
| 340 | |||
| 341 | case PUSHSELFB: | ||
| 342 | aux = *pc++; | ||
| 343 | pushself: { | ||
| 342 | TObject receiver = *(luaD_stack.top-1); | 344 | TObject receiver = *(luaD_stack.top-1); |
| 343 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 345 | *luaD_stack.top++ = consts[aux]; |
| 344 | luaV_gettable(); | 346 | luaV_gettable(); |
| 345 | *luaD_stack.top++ = receiver; | 347 | *luaD_stack.top++ = receiver; |
| 346 | break; | 348 | break; |
| 347 | } | 349 | } |
| 348 | 350 | ||
| 351 | case PUSHCONSTANT: | ||
| 352 | aux = get_word(pc); goto pushconstant; | ||
| 353 | |||
| 349 | case PUSHCONSTANTB: | 354 | case PUSHCONSTANTB: |
| 350 | *luaD_stack.top++ = func->consts[*pc++]; | 355 | aux = *pc++; |
| 356 | pushconstant: | ||
| 357 | *luaD_stack.top++ = consts[aux]; | ||
| 351 | break; | 358 | break; |
| 352 | 359 | ||
| 353 | case PUSHCONSTANT: | 360 | case PUSHUPVALUE: |
| 354 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 361 | aux = *pc++; goto pushupvalue; |
| 355 | break; | ||
| 356 | 362 | ||
| 357 | case PUSHUPVALUE0: | 363 | case PUSHUPVALUE0: |
| 358 | *luaD_stack.top++ = cl->consts[1]; | 364 | aux = 0; |
| 365 | pushupvalue: | ||
| 366 | *luaD_stack.top++ = cl->consts[aux+1]; | ||
| 359 | break; | 367 | break; |
| 360 | 368 | ||
| 361 | case PUSHUPVALUE: | 369 | case SETLOCAL: |
| 362 | *luaD_stack.top++ = cl->consts[(*pc++)+1]; | 370 | aux = *pc++; goto setlocal; |
| 363 | break; | ||
| 364 | 371 | ||
| 365 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: | 372 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: |
| 366 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: | 373 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: |
| 367 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: | 374 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: |
| 368 | case SETLOCAL9: | 375 | case SETLOCAL9: |
| 369 | *((luaD_stack.stack+base) + (int)(opcode-SETLOCAL0)) = | 376 | aux -= SETLOCAL0; |
| 370 | *(--luaD_stack.top); | 377 | setlocal: |
| 378 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); | ||
| 371 | break; | 379 | break; |
| 372 | 380 | ||
| 373 | case SETLOCAL: | 381 | case SETGLOBAL: |
| 374 | *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; | 382 | aux = get_word(pc); goto setglobal; |
| 375 | 383 | ||
| 376 | case SETGLOBALB: | 384 | case SETGLOBALB: |
| 377 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 385 | aux = *pc++; |
| 378 | break; | 386 | setglobal: |
| 379 | 387 | luaV_setglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | |
| 380 | case SETGLOBAL: | ||
| 381 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | ||
| 382 | break; | 388 | break; |
| 383 | 389 | ||
| 384 | case SETTABLE0: | 390 | case SETTABLE0: |
| @@ -389,14 +395,17 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 389 | luaV_settable(luaD_stack.top-3-(*pc++), 2); | 395 | luaV_settable(luaD_stack.top-3-(*pc++), 2); |
| 390 | break; | 396 | break; |
| 391 | 397 | ||
| 398 | case SETLIST: | ||
| 399 | aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist; | ||
| 400 | |||
| 392 | case SETLIST0: | 401 | case SETLIST0: |
| 393 | case SETLIST: { | 402 | aux = 0; |
| 394 | int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH; | 403 | setlist: { |
| 395 | int n = *(pc++); | 404 | int n = *(pc++); |
| 396 | TObject *arr = luaD_stack.top-n-1; | 405 | TObject *arr = luaD_stack.top-n-1; |
| 397 | for (; n; n--) { | 406 | for (; n; n--) { |
| 398 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 407 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
| 399 | nvalue(luaD_stack.top) = n+m; | 408 | nvalue(luaD_stack.top) = n+aux; |
| 400 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); | 409 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); |
| 401 | luaD_stack.top--; | 410 | luaD_stack.top--; |
| 402 | } | 411 | } |
| @@ -414,7 +423,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 414 | } | 423 | } |
| 415 | 424 | ||
| 416 | case POPS: | 425 | case POPS: |
| 417 | luaD_stack.top -= *(pc++); | 426 | aux = *pc++; goto pop; |
| 427 | |||
| 428 | case POP1: case POP2: | ||
| 429 | aux -= (POP1-1); | ||
| 430 | pop: | ||
| 431 | luaD_stack.top -= aux; | ||
| 418 | break; | 432 | break; |
| 419 | 433 | ||
| 420 | case ARGS: | 434 | case ARGS: |
| @@ -436,7 +450,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 436 | case EQOP: case NEQOP: { | 450 | case EQOP: case NEQOP: { |
| 437 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); | 451 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); |
| 438 | luaD_stack.top--; | 452 | luaD_stack.top--; |
| 439 | if (opcode == NEQOP) res = !res; | 453 | if (aux == NEQOP) res = !res; |
| 440 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; | 454 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; |
| 441 | nvalue(luaD_stack.top-1) = 1; | 455 | nvalue(luaD_stack.top-1) = 1; |
| 442 | break; | 456 | break; |
| @@ -578,6 +592,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 578 | break; | 592 | break; |
| 579 | 593 | ||
| 580 | case CLOSURE: | 594 | case CLOSURE: |
| 595 | aux = get_word(pc); goto closure; | ||
| 596 | |||
| 597 | case CLOSUREB: | ||
| 598 | aux = *pc++; | ||
| 599 | closure: | ||
| 600 | *luaD_stack.top++ = consts[aux]; | ||
| 581 | luaV_closure(); | 601 | luaV_closure(); |
| 582 | luaC_checkGC(); | 602 | luaC_checkGC(); |
| 583 | break; | 603 | break; |
| @@ -594,7 +614,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
| 594 | case RETCODE: | 614 | case RETCODE: |
| 595 | if (lua_callhook) | 615 | if (lua_callhook) |
| 596 | luaD_callHook(base, LUA_T_MARK, 1); | 616 | luaD_callHook(base, LUA_T_MARK, 1); |
| 597 | return (base + ((opcode==RETCODE) ? *pc : 0)); | 617 | return (base + ((aux==RETCODE) ? *pc : 0)); |
| 598 | 618 | ||
| 599 | case SETLINE: { | 619 | case SETLINE: { |
| 600 | int line = get_word(pc); | 620 | int line = get_word(pc); |
