aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-22 17:53:20 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-22 17:53:20 -0300
commitd6c867ea507c5f6f9aee730bdcecee8f80a2feed (patch)
tree0eda337c0057614118656222e00966dec68a227f
parent2079cfe8faa34ebe435d1ef0526b04d3e57b5349 (diff)
downloadlua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.tar.gz
lua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.tar.bz2
lua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.zip
better way to cope with opcode variants
-rw-r--r--lopcodes.h31
-rw-r--r--lua.stx180
-rw-r--r--lvm.c126
3 files changed, 160 insertions, 177 deletions
diff --git a/lopcodes.h b/lopcodes.h
index ccab6341..7ba79e25 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -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
11typedef enum { 18typedef enum {
12/* name parm before after side effect 19/* name parm before after side effect
13-----------------------------------------------------------------------------*/ 20-----------------------------------------------------------------------------*/
@@ -15,15 +22,19 @@ ENDCODE,
15 22
16PUSHNIL,/* - nil */ 23PUSHNIL,/* - nil */
17PUSHNILS,/* b - nil_1...nil_b */ 24PUSHNILS,/* b - nil_1...nil_b */
25
18PUSH0,/* - 0.0 */ 26PUSH0,/* - 0.0 */
19PUSH1,/* - 1.0 */ 27PUSH1,/* - 1.0 */
20PUSH2,/* - 2.0 */ 28PUSH2,/* - 2.0 */
21PUSHBYTE,/* b - (float)b */ 29PUSHBYTE,/* b - (float)b */
22PUSHWORD,/* w - (float)w */ 30PUSHWORD,/* w - (float)w */
31
23PUSHCONSTANTB,/*b - CNST[b] */ 32PUSHCONSTANTB,/*b - CNST[b] */
24PUSHCONSTANT,/* w - CNST[w] */ 33PUSHCONSTANT,/* w - CNST[w] */
34
25PUSHUPVALUE0, 35PUSHUPVALUE0,
26PUSHUPVALUE,/* b - Closure[b] */ 36PUSHUPVALUE,/* b - Closure[b] */
37
27PUSHLOCAL0,/* - LOC[0] */ 38PUSHLOCAL0,/* - LOC[0] */
28PUSHLOCAL1,/* - LOC[1] */ 39PUSHLOCAL1,/* - LOC[1] */
29PUSHLOCAL2,/* - LOC[2] */ 40PUSHLOCAL2,/* - LOC[2] */
@@ -35,10 +46,15 @@ PUSHLOCAL7,/* - LOC[7] */
35PUSHLOCAL8,/* - LOC[8] */ 46PUSHLOCAL8,/* - LOC[8] */
36PUSHLOCAL9,/* - LOC[9] */ 47PUSHLOCAL9,/* - LOC[9] */
37PUSHLOCAL,/* b - LOC[b] */ 48PUSHLOCAL,/* b - LOC[b] */
38PUSHGLOBALB,/* b - VAR[CNST[b]] */ 49
39PUSHGLOBAL,/* w - VAR[CNST[w]] */ 50GETGLOBALB,/* b - VAR[CNST[b]] */
51GETGLOBAL,/* w - VAR[CNST[w]] */
52
40GETTABLE,/* i t t[i] */ 53GETTABLE,/* i t t[i] */
54
55PUSHSELFB,/* b t t t[CNST[b]] */
41PUSHSELF,/* w t t t[CNST[w]] */ 56PUSHSELF,/* w t t t[CNST[w]] */
57
42CREATEARRAY,/* w - newarray(size = w) */ 58CREATEARRAY,/* w - newarray(size = w) */
43 59
44SETLOCAL0,/* x - LOC[0]=x */ 60SETLOCAL0,/* x - LOC[0]=x */
@@ -52,10 +68,13 @@ SETLOCAL7,/* x - LOC[7]=x */
52SETLOCAL8,/* x - LOC[8]=x */ 68SETLOCAL8,/* x - LOC[8]=x */
53SETLOCAL9,/* x - LOC[9]=x */ 69SETLOCAL9,/* x - LOC[9]=x */
54SETLOCAL,/* b x - LOC[b]=x */ 70SETLOCAL,/* b x - LOC[b]=x */
71
55SETGLOBALB,/* b x - VAR[CNST[b]]=x */ 72SETGLOBALB,/* b x - VAR[CNST[b]]=x */
56SETGLOBAL,/* w x - VAR[CNST[w]]=x */ 73SETGLOBAL,/* w x - VAR[CNST[w]]=x */
74
57SETTABLE0,/* v i t - t[i]=v */ 75SETTABLE0,/* v i t - t[i]=v */
58SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ 76SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */
77
59SETLIST0,/* b v_b...v_1 t - t[i]=v_i */ 78SETLIST0,/* b v_b...v_1 t - t[i]=v_i */
60SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ 79SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */
61SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */ 80SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */
@@ -82,10 +101,14 @@ UPJMP,/* w - - PC-=w */
82IFFJMP,/* w x - (x==nil)? PC+=w */ 101IFFJMP,/* w x - (x==nil)? PC+=w */
83IFFUPJMP,/* w x - (x==nil)? PC-=w */ 102IFFUPJMP,/* w x - (x==nil)? PC-=w */
84 103
85CLOSURE,/* f v_1...v_n c(f) */ 104CLOSUREB,/* b v_1...v_n c(CNST[b]) */
105CLOSURE,/* w v_1...v_n c(CNST[w]) */
106
86CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ 107CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */
87RETCODE,/* b - - */ 108RETCODE,/* b - - */
88SETLINE,/* w - - LINE=w */ 109SETLINE,/* w - - LINE=w */
110POP1,/* - - TOP-=1 */
111POP2,/* - - TOP-=2 */
89POPS,/* b - - TOP-=b */ 112POPS,/* b - - TOP-=b */
90ARGS,/* b - - TOP=BASE+b */ 113ARGS,/* b - - TOP=BASE+b */
91VARARGS/* b v_x...v_1 {v_1...v_x;n=x} TOP=BASE+b+1 */ 114VARARGS/* b v_x...v_1 {v_1...v_x;n=x} TOP=BASE+b+1 */
diff --git a/lua.stx b/lua.stx
index 51159737..c7d90e20 100644
--- a/lua.stx
+++ b/lua.stx
@@ -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
97static 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
106static void code_word (int n)
107{
108 code_byte(n&0xFF);
109 code_byte(n>>8);
110}
111
112
97static void deltastack (int delta) 113static 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
115static void code_push (OpCode op) 131static 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
144static 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
136static 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
145static void code_word (int n)
146{
147 code_byte(n&0xFF);
148 code_byte(n>>8);
149}
150
151static void code_constant (int c) 168static 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)
216static void code_number (real f) 226static 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
367static void adjuststack (int n) 362static 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
427static void lua_pushvar (vardesc number) 414static 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
781table : 734table :
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
792functioncall : funcvalue funcParams 740functioncall : funcvalue funcParams
@@ -801,8 +749,7 @@ functioncall : funcvalue funcParams
801funcvalue : varexp { $$ = 0; } 749funcvalue : 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
911var : singlevar { $$ = $1; } 858var : 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
923singlevar : NAME { $$ = singlevar($1, currState); } 863singlevar : NAME { $$ = singlevar($1, currState); }
diff --git a/lvm.c b/lvm.c
index 50213247..90237f14 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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*/
277StkId luaV_execute (Closure *cl, StkId base) 277StkId 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);