diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-19 15:40:32 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-19 15:40:32 -0300 |
commit | dfe03c7abea6a00925a56239dfaac5be2770396e (patch) | |
tree | 0e8e3cd14d37594f29cb20781af668da3a219758 | |
parent | 8cd67ac676fd7ff6c085e1ad6675ba6af0cb1fc3 (diff) | |
download | lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.gz lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.bz2 lua-dfe03c7abea6a00925a56239dfaac5be2770396e.zip |
small optimizations (bit scrubbing)
-rw-r--r-- | lopcodes.h | 4 | ||||
-rw-r--r-- | lua.stx | 126 | ||||
-rw-r--r-- | lvm.c | 187 |
3 files changed, 141 insertions, 176 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: $ | 2 | ** $Id: lopcodes.h,v 1.1 1997/09/16 19:25:59 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 | */ |
@@ -36,7 +36,7 @@ PUSHLOCAL8,/* - LOC[8] */ | |||
36 | PUSHLOCAL9,/* - LOC[9] */ | 36 | PUSHLOCAL9,/* - LOC[9] */ |
37 | PUSHLOCAL,/* b - LOC[b] */ | 37 | PUSHLOCAL,/* b - LOC[b] */ |
38 | PUSHGLOBAL,/* w - VAR[w] */ | 38 | PUSHGLOBAL,/* w - VAR[w] */ |
39 | PUSHTABLE,/* i t t[i] */ | 39 | GETTABLE,/* i t t[i] */ |
40 | PUSHSELF,/* w t t t[CNST[w]] */ | 40 | PUSHSELF,/* w t t t[CNST[w]] */ |
41 | CREATEARRAY,/* w - newarray(size = w) */ | 41 | CREATEARRAY,/* w - newarray(size = w) */ |
42 | 42 | ||
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | /* | 2 | /* |
3 | ** $Id: $ | 3 | ** $Id: lua.stx,v 1.1 1997/09/16 19:33:21 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 | */ |
@@ -111,6 +111,27 @@ static void code_opcode (OpCode op, int delta) | |||
111 | } | 111 | } |
112 | 112 | ||
113 | 113 | ||
114 | static void code_push (OpCode op) | ||
115 | { | ||
116 | code_opcode(op, 1); | ||
117 | } | ||
118 | |||
119 | |||
120 | static void code_pop (OpCode op) | ||
121 | { | ||
122 | code_opcode(op, -1); | ||
123 | } | ||
124 | |||
125 | /* binary operations get 2 arguments and leave one, so they pop one */ | ||
126 | #define code_binop(op) code_pop(op) | ||
127 | |||
128 | |||
129 | #define code_neutralop(op) code_byte(op) | ||
130 | |||
131 | /* unary operations get 1 argument and leave one, so they are neutral */ | ||
132 | #define code_unop(op) code_neutralop(op) | ||
133 | |||
134 | |||
114 | static void code_word_at (int pc, int n) | 135 | static void code_word_at (int pc, int n) |
115 | { | 136 | { |
116 | Word w = n; | 137 | Word w = n; |
@@ -129,11 +150,11 @@ static void code_word (int n) | |||
129 | static void code_constant (int c) | 150 | static void code_constant (int c) |
130 | { | 151 | { |
131 | if (c <= 255) { | 152 | if (c <= 255) { |
132 | code_opcode(PUSHCONSTANTB, 1); | 153 | code_push(PUSHCONSTANTB); |
133 | code_byte(c); | 154 | code_byte(c); |
134 | } | 155 | } |
135 | else { | 156 | else { |
136 | code_opcode(PUSHCONSTANT, 1); | 157 | code_push(PUSHCONSTANT); |
137 | code_word(c); | 158 | code_word(c); |
138 | } | 159 | } |
139 | } | 160 | } |
@@ -197,13 +218,13 @@ static void code_number (real f) | |||
197 | Word i; | 218 | Word i; |
198 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) { | 219 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) { |
199 | /* f has an (short) integer value */ | 220 | /* f has an (short) integer value */ |
200 | if (i <= 2) code_opcode(PUSH0 + i, 1); | 221 | if (i <= 2) code_push(PUSH0 + i); |
201 | else if (i <= 255) { | 222 | else if (i <= 255) { |
202 | code_opcode(PUSHBYTE, 1); | 223 | code_push(PUSHBYTE); |
203 | code_byte(i); | 224 | code_byte(i); |
204 | } | 225 | } |
205 | else { | 226 | else { |
206 | code_opcode(PUSHWORD, 1); | 227 | code_push(PUSHWORD); |
207 | code_word(i); | 228 | code_word(i); |
208 | } | 229 | } |
209 | } | 230 | } |
@@ -324,9 +345,9 @@ static void pushupvalue (TaggedString *n) | |||
324 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); | 345 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); |
325 | i = indexupvalue(n); | 346 | i = indexupvalue(n); |
326 | if (i == 0) | 347 | if (i == 0) |
327 | code_opcode(PUSHUPVALUE0, 1); | 348 | code_push(PUSHUPVALUE0); |
328 | else { | 349 | else { |
329 | code_opcode(PUSHUPVALUE, 1); | 350 | code_push(PUSHUPVALUE); |
330 | code_byte(i); | 351 | code_byte(i); |
331 | } | 352 | } |
332 | } | 353 | } |
@@ -336,7 +357,7 @@ void luaY_codedebugline (int line) | |||
336 | { | 357 | { |
337 | static int lastline = 0; | 358 | static int lastline = 0; |
338 | if (lua_debug && line != lastline) { | 359 | if (lua_debug && line != lastline) { |
339 | code_opcode(SETLINE, 0); | 360 | code_neutralop(SETLINE); |
340 | code_word(line); | 361 | code_word(line); |
341 | lastline = line; | 362 | lastline = line; |
342 | } | 363 | } |
@@ -351,7 +372,7 @@ static void adjuststack (int n) | |||
351 | } | 372 | } |
352 | else if (n < 0) { | 373 | else if (n < 0) { |
353 | if (n == -1) | 374 | if (n == -1) |
354 | code_opcode(PUSHNIL, 1); | 375 | code_push(PUSHNIL); |
355 | else { | 376 | else { |
356 | code_opcode(PUSHNILS, -n); | 377 | code_opcode(PUSHNILS, -n); |
357 | code_byte(-n); | 378 | code_byte(-n); |
@@ -406,20 +427,20 @@ static void code_args (int dots) | |||
406 | static void lua_pushvar (vardesc number) | 427 | static void lua_pushvar (vardesc number) |
407 | { | 428 | { |
408 | if (number > 0) { /* global var */ | 429 | if (number > 0) { /* global var */ |
409 | code_opcode(PUSHGLOBAL, 1); | 430 | code_push(PUSHGLOBAL); |
410 | code_word(number-1); | 431 | code_word(number-1); |
411 | } | 432 | } |
412 | else if (number < 0) { /* local var */ | 433 | else if (number < 0) { /* local var */ |
413 | number = (-number) - 1; | 434 | number = (-number) - 1; |
414 | if (number < 10) | 435 | if (number < 10) |
415 | code_opcode(PUSHLOCAL0 + number, 1); | 436 | code_push(PUSHLOCAL0 + number); |
416 | else { | 437 | else { |
417 | code_opcode(PUSHLOCAL, 1); | 438 | code_push(PUSHLOCAL); |
418 | code_byte(number); | 439 | code_byte(number); |
419 | } | 440 | } |
420 | } | 441 | } |
421 | else { | 442 | else { |
422 | code_opcode(PUSHTABLE, -1); | 443 | code_pop(GETTABLE); |
423 | } | 444 | } |
424 | } | 445 | } |
425 | 446 | ||
@@ -429,15 +450,15 @@ static void storevar (vardesc number) | |||
429 | if (number == 0) /* indexed var */ | 450 | if (number == 0) /* indexed var */ |
430 | code_opcode(SETTABLE0, -3); | 451 | code_opcode(SETTABLE0, -3); |
431 | else if (number > 0) { /* global var */ | 452 | else if (number > 0) { /* global var */ |
432 | code_opcode(SETGLOBAL, -1); | 453 | code_pop(SETGLOBAL); |
433 | code_word(number-1); | 454 | code_word(number-1); |
434 | } | 455 | } |
435 | else { /* number < 0 - local var */ | 456 | else { /* number < 0 - local var */ |
436 | number = (-number) - 1; | 457 | number = (-number) - 1; |
437 | if (number < 10) | 458 | if (number < 10) |
438 | code_opcode(SETLOCAL0 + number, -1); | 459 | code_pop(SETLOCAL0 + number); |
439 | else { | 460 | else { |
440 | code_opcode(SETLOCAL, -1); | 461 | code_pop(SETLOCAL); |
441 | code_byte(number); | 462 | code_byte(number); |
442 | } | 463 | } |
443 | } | 464 | } |
@@ -453,7 +474,7 @@ static int lua_codestore (int i, int left) | |||
453 | return left; | 474 | return left; |
454 | } | 475 | } |
455 | else { /* indexed var with values in between*/ | 476 | else { /* indexed var with values in between*/ |
456 | code_opcode(SETTABLE, -1); | 477 | code_pop(SETTABLE); |
457 | code_byte(left+i); /* number of elements between table/index and value */ | 478 | code_byte(left+i); /* number of elements between table/index and value */ |
458 | return left+2; /* table/index are not poped, since they are not on top */ | 479 | return left+2; /* table/index are not poped, since they are not on top */ |
459 | } | 480 | } |
@@ -485,7 +506,7 @@ static void code_shortcircuit (int pc, Byte jmp) | |||
485 | 506 | ||
486 | static void codereturn (void) | 507 | static void codereturn (void) |
487 | { | 508 | { |
488 | code_opcode(RETCODE, 0); | 509 | code_neutralop(RETCODE); |
489 | code_byte(currState->nlocalvar); | 510 | code_byte(currState->nlocalvar); |
490 | currState->stacksize = currState->nlocalvar; | 511 | currState->stacksize = currState->nlocalvar; |
491 | } | 512 | } |
@@ -542,7 +563,7 @@ static void init_func (void) | |||
542 | static TProtoFunc *close_func (void) | 563 | static TProtoFunc *close_func (void) |
543 | { | 564 | { |
544 | TProtoFunc *f = currState->f; | 565 | TProtoFunc *f = currState->f; |
545 | code_opcode(ENDCODE, 0); | 566 | code_neutralop(ENDCODE); |
546 | f->code[0] = currState->maxstacksize; | 567 | f->code[0] = currState->maxstacksize; |
547 | f->code = luaM_reallocvector(f->code, currState->pc, Byte); | 568 | f->code = luaM_reallocvector(f->code, currState->pc, Byte); |
548 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); | 569 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); |
@@ -624,8 +645,7 @@ chunk : statlist ret | |||
624 | ; | 645 | ; |
625 | 646 | ||
626 | statlist : /* empty */ | 647 | statlist : /* empty */ |
627 | | statlist stat sc { if (currState->stacksize != currState->nlocalvar) | 648 | | statlist stat sc |
628 | { luaY_error("contagem"); exit(1); }} | ||
629 | ; | 649 | ; |
630 | 650 | ||
631 | sc : /* empty */ | ';' ; | 651 | sc : /* empty */ | ';' ; |
@@ -707,7 +727,7 @@ ret : /* empty */ | |||
707 | PrepJump : /* empty */ | 727 | PrepJump : /* empty */ |
708 | { | 728 | { |
709 | $$ = currState->pc; | 729 | $$ = currState->pc; |
710 | code_opcode(0, 0); /* open space */ | 730 | code_byte(0); /* open space */ |
711 | code_word(0); | 731 | code_word(0); |
712 | } | 732 | } |
713 | ; | 733 | ; |
@@ -718,47 +738,35 @@ PrepJumpPop : PrepJump { $$ = $1; deltastack(-1); /* pop condition */ } | |||
718 | expr1 : expr { adjust_functioncall($1, 1); } | 738 | expr1 : expr { adjust_functioncall($1, 1); } |
719 | ; | 739 | ; |
720 | 740 | ||
721 | expr : '(' expr ')' { $$ = $2; } | 741 | expr : '(' expr ')' { $$ = $2; } |
722 | | expr1 EQ expr1 { code_opcode(EQOP, -1); $$ = 0; } | 742 | | expr1 EQ expr1 { code_binop(EQOP); $$ = 0; } |
723 | | expr1 '<' expr1 { code_opcode(LTOP, -1); $$ = 0; } | 743 | | expr1 '<' expr1 { code_binop(LTOP); $$ = 0; } |
724 | | expr1 '>' expr1 { code_opcode(GTOP, -1); $$ = 0; } | 744 | | expr1 '>' expr1 { code_binop(GTOP); $$ = 0; } |
725 | | expr1 NE expr1 { code_opcode(NEQOP, -1); $$ = 0; } | 745 | | expr1 NE expr1 { code_binop(NEQOP); $$ = 0; } |
726 | | expr1 LE expr1 { code_opcode(LEOP, -1); $$ = 0; } | 746 | | expr1 LE expr1 { code_binop(LEOP); $$ = 0; } |
727 | | expr1 GE expr1 { code_opcode(GEOP, -1); $$ = 0; } | 747 | | expr1 GE expr1 { code_binop(GEOP); $$ = 0; } |
728 | | expr1 '+' expr1 { code_opcode(ADDOP, -1); $$ = 0; } | 748 | | expr1 '+' expr1 { code_binop(ADDOP); $$ = 0; } |
729 | | expr1 '-' expr1 { code_opcode(SUBOP, -1); $$ = 0; } | 749 | | expr1 '-' expr1 { code_binop(SUBOP); $$ = 0; } |
730 | | expr1 '*' expr1 { code_opcode(MULTOP, -1); $$ = 0; } | 750 | | expr1 '*' expr1 { code_binop(MULTOP); $$ = 0; } |
731 | | expr1 '/' expr1 { code_opcode(DIVOP, -1); $$ = 0; } | 751 | | expr1 '/' expr1 { code_binop(DIVOP); $$ = 0; } |
732 | | expr1 '^' expr1 { code_opcode(POWOP, -1); $$ = 0; } | 752 | | expr1 '^' expr1 { code_binop(POWOP); $$ = 0; } |
733 | | expr1 CONC expr1 { code_opcode(CONCOP, -1); $$ = 0; } | 753 | | expr1 CONC expr1 { code_binop(CONCOP); $$ = 0; } |
734 | | '-' expr1 %prec UNARY { code_opcode(MINUSOP, 0); $$ = 0;} | 754 | | '-' expr1 %prec UNARY { code_unop(MINUSOP); $$ = 0;} |
755 | | NOT expr1 { code_unop(NOTOP); $$ = 0;} | ||
735 | | table { $$ = 0; } | 756 | | table { $$ = 0; } |
736 | | varexp { $$ = 0;} | 757 | | varexp { $$ = 0;} |
737 | | NUMBER { code_number($1); $$ = 0; } | 758 | | NUMBER { code_number($1); $$ = 0; } |
738 | | STRING | 759 | | STRING { code_string($1); $$ = 0; } |
739 | { | 760 | | NIL {code_push(PUSHNIL); $$ = 0; } |
740 | code_string($1); | 761 | | functioncall { $$ = $1; } |
741 | $$ = 0; | 762 | | expr1 AND PrepJumpPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } |
742 | } | 763 | | expr1 OR PrepJumpPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } |
743 | | NIL {code_opcode(PUSHNIL, 1); $$ = 0; } | ||
744 | | functioncall { $$ = $1; } | ||
745 | | NOT expr1 { code_opcode(NOTOP, 0); $$ = 0;} | ||
746 | | expr1 AND PrepJumpPop expr1 | ||
747 | { | ||
748 | code_shortcircuit($3, ONFJMP); | ||
749 | $$ = 0; | ||
750 | } | ||
751 | | expr1 OR PrepJumpPop expr1 | ||
752 | { | ||
753 | code_shortcircuit($3, ONTJMP); | ||
754 | $$ = 0; | ||
755 | } | ||
756 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } | 764 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } |
757 | ; | 765 | ; |
758 | 766 | ||
759 | table : | 767 | table : |
760 | { | 768 | { |
761 | code_opcode(CREATEARRAY, 1); | 769 | code_push(CREATEARRAY); |
762 | $<vInt>$ = currState->pc; code_word(0); | 770 | $<vInt>$ = currState->pc; code_word(0); |
763 | } | 771 | } |
764 | '{' fieldlist '}' | 772 | '{' fieldlist '}' |
@@ -779,7 +787,7 @@ functioncall : funcvalue funcParams | |||
779 | funcvalue : varexp { $$ = 0; } | 787 | funcvalue : varexp { $$ = 0; } |
780 | | varexp ':' NAME | 788 | | varexp ':' NAME |
781 | { | 789 | { |
782 | code_opcode(PUSHSELF, 1); | 790 | code_push(PUSHSELF); |
783 | code_word(string_constant($3)); | 791 | code_word(string_constant($3)); |
784 | $$ = 1; | 792 | $$ = 1; |
785 | } | 793 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: $ | 2 | ** $Id: lvm.c,v 1.1 1997/09/16 19:25:59 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,7 +22,9 @@ | |||
22 | #include "lvm.h" | 22 | #include "lvm.h" |
23 | 23 | ||
24 | 24 | ||
25 | #define get_word(w,pc) {w=*pc+(*(pc+1)<<8); pc+=2;} | 25 | #define get_prevword(pc) (*(pc-2)+(*(pc-1)<<8)) |
26 | #define get_word(pc) (pc+=2, get_prevword(pc)) | ||
27 | #define skip_word(pc) {pc+=2;} | ||
26 | 28 | ||
27 | 29 | ||
28 | /* 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), ... */ |
@@ -159,15 +161,13 @@ void luaV_getglobal (Word n) | |||
159 | TObject *value = &luaG_global[n].object; | 161 | TObject *value = &luaG_global[n].object; |
160 | TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); | 162 | TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); |
161 | if (ttype(im) == LUA_T_NIL) { /* default behavior */ | 163 | if (ttype(im) == LUA_T_NIL) { /* default behavior */ |
162 | *luaD_stack.top = *value; | 164 | *luaD_stack.top++ = *value; |
163 | luaD_stack.top++; | ||
164 | } | 165 | } |
165 | else { | 166 | else { |
166 | ttype(luaD_stack.top) = LUA_T_STRING; | 167 | ttype(luaD_stack.top) = LUA_T_STRING; |
167 | tsvalue(luaD_stack.top) = luaG_global[n].varname; | 168 | tsvalue(luaD_stack.top) = luaG_global[n].varname; |
168 | luaD_stack.top++; | 169 | luaD_stack.top++; |
169 | *luaD_stack.top = *value; | 170 | *luaD_stack.top++ = *value; |
170 | luaD_stack.top++; | ||
171 | luaD_callTM(im, 2, 1); | 171 | luaD_callTM(im, 2, 1); |
172 | } | 172 | } |
173 | } | 173 | } |
@@ -184,10 +184,8 @@ void luaV_setglobal (Word n) | |||
184 | TObject newvalue = *(luaD_stack.top-1); | 184 | TObject newvalue = *(luaD_stack.top-1); |
185 | ttype(luaD_stack.top-1) = LUA_T_STRING; | 185 | ttype(luaD_stack.top-1) = LUA_T_STRING; |
186 | tsvalue(luaD_stack.top-1) = luaG_global[n].varname; | 186 | tsvalue(luaD_stack.top-1) = luaG_global[n].varname; |
187 | *luaD_stack.top = *oldvalue; | 187 | *luaD_stack.top++ = *oldvalue; |
188 | luaD_stack.top++; | 188 | *luaD_stack.top++ = newvalue; |
189 | *luaD_stack.top = newvalue; | ||
190 | luaD_stack.top++; | ||
191 | luaD_callTM(im, 3, 0); | 189 | luaD_callTM(im, 3, 0); |
192 | } | 190 | } |
193 | } | 191 | } |
@@ -266,8 +264,7 @@ static void adjust_varargs (StkId first_extra_arg) | |||
266 | luaV_pack(first_extra_arg, | 264 | luaV_pack(first_extra_arg, |
267 | (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg); | 265 | (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg); |
268 | luaD_adjusttop(first_extra_arg); | 266 | luaD_adjusttop(first_extra_arg); |
269 | *luaD_stack.top = arg; | 267 | *luaD_stack.top++ = arg; |
270 | luaD_stack.top++; | ||
271 | } | 268 | } |
272 | 269 | ||
273 | 270 | ||
@@ -289,8 +286,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
289 | switch (opcode = (OpCode)*pc++) { | 286 | switch (opcode = (OpCode)*pc++) { |
290 | 287 | ||
291 | case PUSHNIL: | 288 | case PUSHNIL: |
292 | ttype(luaD_stack.top) = LUA_T_NIL; | 289 | ttype(luaD_stack.top++) = LUA_T_NIL; |
293 | luaD_stack.top++; | ||
294 | break; | 290 | break; |
295 | 291 | ||
296 | case PUSHNILS: { | 292 | case PUSHNILS: { |
@@ -312,72 +308,55 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
312 | luaD_stack.top++; | 308 | luaD_stack.top++; |
313 | break; | 309 | break; |
314 | 310 | ||
315 | case PUSHWORD: { | 311 | case PUSHWORD: |
316 | Word w; | ||
317 | get_word(w,pc); | ||
318 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 312 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
319 | nvalue(luaD_stack.top) = w; | 313 | nvalue(luaD_stack.top) = get_word(pc); |
320 | luaD_stack.top++; | 314 | luaD_stack.top++; |
321 | break; | 315 | break; |
322 | } | ||
323 | 316 | ||
324 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: | 317 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: |
325 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: | 318 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: |
326 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: | 319 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: |
327 | case PUSHLOCAL9: | 320 | case PUSHLOCAL9: |
328 | *luaD_stack.top = *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); | 321 | *luaD_stack.top++ = |
329 | luaD_stack.top++; | 322 | *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); |
330 | break; | 323 | break; |
331 | 324 | ||
332 | case PUSHLOCAL: | 325 | case PUSHLOCAL: |
333 | *luaD_stack.top = *((luaD_stack.stack+base) + (*pc++)); | 326 | *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++)); |
334 | luaD_stack.top++; | ||
335 | break; | 327 | break; |
336 | 328 | ||
337 | case PUSHGLOBAL: { | 329 | case PUSHGLOBAL: |
338 | Word w; | 330 | luaV_getglobal(get_word(pc)); |
339 | get_word(w,pc); | ||
340 | luaV_getglobal(w); | ||
341 | break; | 331 | break; |
342 | } | ||
343 | 332 | ||
344 | case PUSHTABLE: | 333 | case GETTABLE: |
345 | luaV_gettable(); | 334 | luaV_gettable(); |
346 | break; | 335 | break; |
347 | 336 | ||
348 | case PUSHSELF: { | 337 | case PUSHSELF: { |
349 | TObject receiver = *(luaD_stack.top-1); | 338 | TObject receiver = *(luaD_stack.top-1); |
350 | Word w; | 339 | *luaD_stack.top++ = func->consts[get_word(pc)]; |
351 | get_word(w,pc); | ||
352 | *luaD_stack.top = func->consts[w]; | ||
353 | luaD_stack.top++; | ||
354 | luaV_gettable(); | 340 | luaV_gettable(); |
355 | *luaD_stack.top = receiver; | 341 | *luaD_stack.top++ = receiver; |
356 | luaD_stack.top++; | ||
357 | break; | 342 | break; |
358 | } | 343 | } |
359 | 344 | ||
360 | case PUSHCONSTANTB: { | 345 | case PUSHCONSTANTB: |
361 | *luaD_stack.top = func->consts[*pc++]; | 346 | *luaD_stack.top++ = func->consts[*pc++]; |
362 | luaD_stack.top++; | ||
363 | break; | 347 | break; |
364 | } | ||
365 | 348 | ||
366 | case PUSHCONSTANT: { | 349 | case PUSHCONSTANT: |
367 | Word w; | 350 | *luaD_stack.top++ = func->consts[get_word(pc)]; |
368 | get_word(w,pc); | ||
369 | *luaD_stack.top = func->consts[w]; | ||
370 | luaD_stack.top++; | ||
371 | break; | 351 | break; |
372 | } | ||
373 | 352 | ||
374 | case PUSHUPVALUE0: | 353 | case PUSHUPVALUE0: |
375 | case PUSHUPVALUE: { | 354 | *luaD_stack.top++ = cl->consts[1]; |
376 | int i = (opcode == PUSHUPVALUE0) ? 0 : *pc++; | 355 | break; |
377 | *luaD_stack.top = cl->consts[i+1]; | 356 | |
378 | luaD_stack.top++; | 357 | case PUSHUPVALUE: |
358 | *luaD_stack.top++ = cl->consts[(*pc++)+1]; | ||
379 | break; | 359 | break; |
380 | } | ||
381 | 360 | ||
382 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: | 361 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: |
383 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: | 362 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: |
@@ -390,36 +369,28 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
390 | case SETLOCAL: | 369 | case SETLOCAL: |
391 | *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; | 370 | *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; |
392 | 371 | ||
393 | case SETGLOBAL: { | 372 | case SETGLOBAL: |
394 | Word w; | 373 | luaV_setglobal(get_word(pc)); |
395 | get_word(w,pc); | ||
396 | luaV_setglobal(w); | ||
397 | break; | 374 | break; |
398 | } | ||
399 | 375 | ||
400 | case SETTABLE0: | 376 | case SETTABLE0: |
401 | luaV_settable(luaD_stack.top-3, 1); | 377 | luaV_settable(luaD_stack.top-3, 1); |
402 | break; | 378 | break; |
403 | 379 | ||
404 | case SETTABLE: { | 380 | case SETTABLE: |
405 | int n = *pc++; | 381 | luaV_settable(luaD_stack.top-3-(*pc++), 2); |
406 | luaV_settable(luaD_stack.top-3-n, 2); | ||
407 | break; | 382 | break; |
408 | } | ||
409 | 383 | ||
410 | case SETLIST0: | 384 | case SETLIST0: |
411 | case SETLIST: { | 385 | case SETLIST: { |
412 | int m, n; | 386 | int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH; |
413 | TObject *arr; | 387 | int n = *(pc++); |
414 | if (opcode == SETLIST0) m = 0; | 388 | TObject *arr = luaD_stack.top-n-1; |
415 | else m = *(pc++) * LFIELDS_PER_FLUSH; | 389 | for (; n; n--) { |
416 | n = *(pc++); | 390 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
417 | arr = luaD_stack.top-n-1; | 391 | nvalue(luaD_stack.top) = n+m; |
418 | while (n) { | ||
419 | ttype(luaD_stack.top) = LUA_T_NUMBER; nvalue(luaD_stack.top) = n+m; | ||
420 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); | 392 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); |
421 | luaD_stack.top--; | 393 | luaD_stack.top--; |
422 | n--; | ||
423 | } | 394 | } |
424 | break; | 395 | break; |
425 | } | 396 | } |
@@ -447,19 +418,16 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
447 | adjust_varargs(base + *(pc++)); | 418 | adjust_varargs(base + *(pc++)); |
448 | break; | 419 | break; |
449 | 420 | ||
450 | case CREATEARRAY: { | 421 | case CREATEARRAY: |
451 | Word size; | ||
452 | luaC_checkGC(); | 422 | luaC_checkGC(); |
453 | get_word(size,pc); | 423 | avalue(luaD_stack.top) = luaH_new(get_word(pc)); |
454 | avalue(luaD_stack.top) = luaH_new(size); | ||
455 | ttype(luaD_stack.top) = LUA_T_ARRAY; | 424 | ttype(luaD_stack.top) = LUA_T_ARRAY; |
456 | luaD_stack.top++; | 425 | luaD_stack.top++; |
457 | break; | 426 | break; |
458 | } | ||
459 | 427 | ||
460 | case EQOP: case NEQOP: { | 428 | case EQOP: case NEQOP: { |
461 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); | 429 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); |
462 | --luaD_stack.top; | 430 | luaD_stack.top--; |
463 | if (opcode == NEQOP) res = !res; | 431 | if (opcode == NEQOP) res = !res; |
464 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; | 432 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; |
465 | nvalue(luaD_stack.top-1) = 1; | 433 | nvalue(luaD_stack.top-1) = 1; |
@@ -563,51 +531,43 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
563 | nvalue(luaD_stack.top-1) = 1; | 531 | nvalue(luaD_stack.top-1) = 1; |
564 | break; | 532 | break; |
565 | 533 | ||
566 | case ONTJMP: { | 534 | case ONTJMP: |
567 | Word w; | 535 | skip_word(pc); |
568 | get_word(w,pc); | 536 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) |
569 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += w; | 537 | pc += get_prevword(pc); |
570 | else luaD_stack.top--; | 538 | else |
571 | } | 539 | luaD_stack.top--; |
572 | break; | 540 | break; |
573 | 541 | ||
574 | case ONFJMP: { | 542 | case ONFJMP: |
575 | Word w; | 543 | skip_word(pc); |
576 | get_word(w,pc); | 544 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) |
577 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += w; | 545 | pc += get_prevword(pc); |
578 | else luaD_stack.top--; | 546 | else |
547 | luaD_stack.top--; | ||
579 | break; | 548 | break; |
580 | } | ||
581 | 549 | ||
582 | case JMP: { | 550 | case JMP: |
583 | Word w; | 551 | skip_word(pc); |
584 | get_word(w,pc); | 552 | pc += get_prevword(pc); |
585 | pc += w; | ||
586 | break; | 553 | break; |
587 | } | ||
588 | 554 | ||
589 | case UPJMP: { | 555 | case UPJMP: |
590 | Word w; | 556 | skip_word(pc); |
591 | get_word(w,pc); | 557 | pc -= get_prevword(pc); |
592 | pc -= w; | ||
593 | break; | 558 | break; |
594 | } | ||
595 | 559 | ||
596 | case IFFJMP: { | 560 | case IFFJMP: |
597 | Word w; | 561 | skip_word(pc); |
598 | get_word(w,pc); | 562 | if (ttype(--luaD_stack.top) == LUA_T_NIL) |
599 | luaD_stack.top--; | 563 | pc += get_prevword(pc); |
600 | if (ttype(luaD_stack.top) == LUA_T_NIL) pc += w; | ||
601 | break; | 564 | break; |
602 | } | ||
603 | 565 | ||
604 | case IFFUPJMP: { | 566 | case IFFUPJMP: |
605 | Word w; | 567 | skip_word(pc); |
606 | get_word(w,pc); | 568 | if (ttype(--luaD_stack.top) == LUA_T_NIL) |
607 | luaD_stack.top--; | 569 | pc -= get_prevword(pc); |
608 | if (ttype(luaD_stack.top) == LUA_T_NIL) pc -= w; | ||
609 | break; | 570 | break; |
610 | } | ||
611 | 571 | ||
612 | case CLOSURE: | 572 | case CLOSURE: |
613 | luaV_closure(); | 573 | luaV_closure(); |
@@ -615,10 +575,8 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
615 | break; | 575 | break; |
616 | 576 | ||
617 | case CALLFUNC: { | 577 | case CALLFUNC: { |
618 | int nParams = *pc++; | 578 | StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++); |
619 | int nResults = *pc++; | 579 | luaD_call(newBase, *pc++); |
620 | StkId newBase = (luaD_stack.top-luaD_stack.stack)-nParams; | ||
621 | luaD_call(newBase, nResults); | ||
622 | break; | 580 | break; |
623 | } | 581 | } |
624 | 582 | ||
@@ -631,8 +589,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
631 | return (base + ((opcode==RETCODE) ? *pc : 0)); | 589 | return (base + ((opcode==RETCODE) ? *pc : 0)); |
632 | 590 | ||
633 | case SETLINE: { | 591 | case SETLINE: { |
634 | Word line; | 592 | int line = get_word(pc); |
635 | get_word(line,pc); | ||
636 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { | 593 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { |
637 | /* open space for LINE value */ | 594 | /* open space for LINE value */ |
638 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); | 595 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); |