diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-22 17:53:20 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-22 17:53:20 -0300 |
commit | d6c867ea507c5f6f9aee730bdcecee8f80a2feed (patch) | |
tree | 0eda337c0057614118656222e00966dec68a227f | |
parent | 2079cfe8faa34ebe435d1ef0526b04d3e57b5349 (diff) | |
download | lua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.tar.gz lua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.tar.bz2 lua-d6c867ea507c5f6f9aee730bdcecee8f80a2feed.zip |
better way to cope with opcode variants
-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); |