aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-19 15:40:32 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-19 15:40:32 -0300
commitdfe03c7abea6a00925a56239dfaac5be2770396e (patch)
tree0e8e3cd14d37594f29cb20781af668da3a219758
parent8cd67ac676fd7ff6c085e1ad6675ba6af0cb1fc3 (diff)
downloadlua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.gz
lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.bz2
lua-dfe03c7abea6a00925a56239dfaac5be2770396e.zip
small optimizations (bit scrubbing)
-rw-r--r--lopcodes.h4
-rw-r--r--lua.stx126
-rw-r--r--lvm.c187
3 files changed, 141 insertions, 176 deletions
diff --git a/lopcodes.h b/lopcodes.h
index b916092d..29392229 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -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] */
36PUSHLOCAL9,/* - LOC[9] */ 36PUSHLOCAL9,/* - LOC[9] */
37PUSHLOCAL,/* b - LOC[b] */ 37PUSHLOCAL,/* b - LOC[b] */
38PUSHGLOBAL,/* w - VAR[w] */ 38PUSHGLOBAL,/* w - VAR[w] */
39PUSHTABLE,/* i t t[i] */ 39GETTABLE,/* i t t[i] */
40PUSHSELF,/* w t t t[CNST[w]] */ 40PUSHSELF,/* w t t t[CNST[w]] */
41CREATEARRAY,/* w - newarray(size = w) */ 41CREATEARRAY,/* w - newarray(size = w) */
42 42
diff --git a/lua.stx b/lua.stx
index fcd8cb65..4829e9ff 100644
--- a/lua.stx
+++ b/lua.stx
@@ -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
114static void code_push (OpCode op)
115{
116 code_opcode(op, 1);
117}
118
119
120static 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
114static void code_word_at (int pc, int n) 135static 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)
129static void code_constant (int c) 150static 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)
406static void lua_pushvar (vardesc number) 427static 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
486static void codereturn (void) 507static 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)
542static TProtoFunc *close_func (void) 563static 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
626statlist : /* empty */ 647statlist : /* empty */
627 | statlist stat sc { if (currState->stacksize != currState->nlocalvar) 648 | statlist stat sc
628 { luaY_error("contagem"); exit(1); }}
629 ; 649 ;
630 650
631sc : /* empty */ | ';' ; 651sc : /* empty */ | ';' ;
@@ -707,7 +727,7 @@ ret : /* empty */
707PrepJump : /* empty */ 727PrepJump : /* 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 */ }
718expr1 : expr { adjust_functioncall($1, 1); } 738expr1 : expr { adjust_functioncall($1, 1); }
719 ; 739 ;
720 740
721expr : '(' expr ')' { $$ = $2; } 741expr : '(' 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
759table : 767table :
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
779funcvalue : varexp { $$ = 0; } 787funcvalue : 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 }
diff --git a/lvm.c b/lvm.c
index 8993056b..b4818ea9 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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);