diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-10-06 12:51:11 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-10-06 12:51:11 -0200 |
commit | f6a9cc9a673298dc7ee7a416fec08848e464b227 (patch) | |
tree | 4e060d0a52f8a3eecf2fe4850e7124340e21daf7 | |
parent | 28d47a0aaa646f8762085cc7fcf8953b62df0927 (diff) | |
download | lua-f6a9cc9a673298dc7ee7a416fec08848e464b227.tar.gz lua-f6a9cc9a673298dc7ee7a416fec08848e464b227.tar.bz2 lua-f6a9cc9a673298dc7ee7a416fec08848e464b227.zip |
jumps are relative to next instruction
-rw-r--r-- | lopcodes.h | 135 | ||||
-rw-r--r-- | lua.stx | 68 | ||||
-rw-r--r-- | lvm.c | 56 |
3 files changed, 133 insertions, 126 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lopcodes.h,v 1.5 1997/09/24 19:43:11 roberto Exp roberto $ | 2 | ** $Id: lopcodes.h,v 1.6 1997/10/01 20:05:34 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 | */ |
@@ -18,60 +18,60 @@ | |||
18 | typedef enum { | 18 | typedef enum { |
19 | /* name parm before after side effect | 19 | /* name parm before after side effect |
20 | -----------------------------------------------------------------------------*/ | 20 | -----------------------------------------------------------------------------*/ |
21 | ENDCODE, | 21 | ENDCODE,/* - - - */ |
22 | 22 | ||
23 | PUSHNIL,/* - nil */ | 23 | PUSHNIL,/* - - nil */ |
24 | PUSHNILS,/* b - nil_1...nil_b */ | 24 | PUSHNILS,/* b - nil_1...nil_b */ |
25 | 25 | ||
26 | PUSH0,/* - 0.0 */ | 26 | PUSH0,/* - - 0.0 */ |
27 | PUSH1,/* - 1.0 */ | 27 | PUSH1,/* - - 1.0 */ |
28 | PUSH2,/* - 2.0 */ | 28 | PUSH2,/* - - 2.0 */ |
29 | PUSHBYTE,/* b - (float)b */ | 29 | PUSHBYTE,/* b - (float)b */ |
30 | PUSHWORD,/* w - (float)w */ | 30 | PUSHWORD,/* w - (float)w */ |
31 | 31 | ||
32 | PUSHCONSTANT0,/* - CNST[0] */ | 32 | PUSHCONSTANT0,/*- - CNST[0] */ |
33 | PUSHCONSTANT1,/* - CNST[1] */ | 33 | PUSHCONSTANT1,/*- - CNST[1] */ |
34 | PUSHCONSTANT2,/* - CNST[2] */ | 34 | PUSHCONSTANT2,/*- - CNST[2] */ |
35 | PUSHCONSTANT3,/* - CNST[3] */ | 35 | PUSHCONSTANT3,/*- - CNST[3] */ |
36 | PUSHCONSTANT4,/* - CNST[4] */ | 36 | PUSHCONSTANT4,/*- - CNST[4] */ |
37 | PUSHCONSTANT5,/* - CNST[5] */ | 37 | PUSHCONSTANT5,/*- - CNST[5] */ |
38 | PUSHCONSTANT6,/* - CNST[6] */ | 38 | PUSHCONSTANT6,/*- - CNST[6] */ |
39 | PUSHCONSTANT7,/* - CNST[7] */ | 39 | PUSHCONSTANT7,/*- - CNST[7] */ |
40 | PUSHCONSTANT8,/* - CNST[8] */ | 40 | PUSHCONSTANT8,/*- - CNST[8] */ |
41 | PUSHCONSTANT9,/* - CNST[9] */ | 41 | PUSHCONSTANT9,/*- - CNST[9] */ |
42 | PUSHCONSTANTB,/*b - CNST[b] */ | 42 | PUSHCONSTANTB,/*b - CNST[b] */ |
43 | PUSHCONSTANT,/* w - CNST[w] */ | 43 | PUSHCONSTANT,/* w - CNST[w] */ |
44 | 44 | ||
45 | PUSHUPVALUE0, | 45 | PUSHUPVALUE0,/* - - Closure[0] */ |
46 | PUSHUPVALUE1, | 46 | PUSHUPVALUE1,/* - - Closure[1] */ |
47 | PUSHUPVALUE,/* b - Closure[b] */ | 47 | PUSHUPVALUE,/* b - Closure[b] */ |
48 | 48 | ||
49 | PUSHLOCAL0,/* - LOC[0] */ | 49 | PUSHLOCAL0,/* - - LOC[0] */ |
50 | PUSHLOCAL1,/* - LOC[1] */ | 50 | PUSHLOCAL1,/* - - LOC[1] */ |
51 | PUSHLOCAL2,/* - LOC[2] */ | 51 | PUSHLOCAL2,/* - - LOC[2] */ |
52 | PUSHLOCAL3,/* - LOC[3] */ | 52 | PUSHLOCAL3,/* - - LOC[3] */ |
53 | PUSHLOCAL4,/* - LOC[4] */ | 53 | PUSHLOCAL4,/* - - LOC[4] */ |
54 | PUSHLOCAL5,/* - LOC[5] */ | 54 | PUSHLOCAL5,/* - - LOC[5] */ |
55 | PUSHLOCAL6,/* - LOC[6] */ | 55 | PUSHLOCAL6,/* - - LOC[6] */ |
56 | PUSHLOCAL7,/* - LOC[7] */ | 56 | PUSHLOCAL7,/* - - LOC[7] */ |
57 | PUSHLOCAL8,/* - LOC[8] */ | 57 | PUSHLOCAL8,/* - - LOC[8] */ |
58 | PUSHLOCAL9,/* - LOC[9] */ | 58 | PUSHLOCAL9,/* - - LOC[9] */ |
59 | PUSHLOCAL,/* b - LOC[b] */ | 59 | PUSHLOCAL,/* b - LOC[b] */ |
60 | 60 | ||
61 | GETGLOBAL0,/* - VAR[CNST[0]] */ | 61 | GETGLOBAL0,/* - - VAR[CNST[0]] */ |
62 | GETGLOBAL1,/* - VAR[CNST[1]] */ | 62 | GETGLOBAL1,/* - - VAR[CNST[1]] */ |
63 | GETGLOBAL2,/* - VAR[CNST[2]] */ | 63 | GETGLOBAL2,/* - - VAR[CNST[2]] */ |
64 | GETGLOBAL3,/* - VAR[CNST[3]] */ | 64 | GETGLOBAL3,/* - - VAR[CNST[3]] */ |
65 | GETGLOBAL4,/* - VAR[CNST[4]] */ | 65 | GETGLOBAL4,/* - - VAR[CNST[4]] */ |
66 | GETGLOBAL5,/* - VAR[CNST[5]] */ | 66 | GETGLOBAL5,/* - - VAR[CNST[5]] */ |
67 | GETGLOBAL6,/* - VAR[CNST[6]] */ | 67 | GETGLOBAL6,/* - - VAR[CNST[6]] */ |
68 | GETGLOBAL7,/* - VAR[CNST[7]] */ | 68 | GETGLOBAL7,/* - - VAR[CNST[7]] */ |
69 | GETGLOBAL8,/* - VAR[CNST[8]] */ | 69 | GETGLOBAL8,/* - - VAR[CNST[8]] */ |
70 | GETGLOBAL9,/* - VAR[CNST[9]] */ | 70 | GETGLOBAL9,/* - - VAR[CNST[9]] */ |
71 | GETGLOBALB,/* b - VAR[CNST[b]] */ | 71 | GETGLOBALB,/* b - VAR[CNST[b]] */ |
72 | GETGLOBAL,/* w - VAR[CNST[w]] */ | 72 | GETGLOBAL,/* w - VAR[CNST[w]] */ |
73 | 73 | ||
74 | GETTABLE,/* i t t[i] */ | 74 | GETTABLE,/* - i t t[i] */ |
75 | 75 | ||
76 | PUSHSELFB,/* b t t t[CNST[b]] */ | 76 | PUSHSELFB,/* b t t t[CNST[b]] */ |
77 | PUSHSELF,/* w t t t[CNST[w]] */ | 77 | PUSHSELF,/* w t t t[CNST[w]] */ |
@@ -79,44 +79,43 @@ PUSHSELF,/* w t t t[CNST[w]] */ | |||
79 | CREATEARRAYB,/* b - newarray(size = b) */ | 79 | CREATEARRAYB,/* b - newarray(size = b) */ |
80 | CREATEARRAY,/* w - newarray(size = w) */ | 80 | CREATEARRAY,/* w - newarray(size = w) */ |
81 | 81 | ||
82 | SETLOCAL0,/* x - LOC[0]=x */ | 82 | SETLOCAL0,/* - x - LOC[0]=x */ |
83 | SETLOCAL1,/* x - LOC[1]=x */ | 83 | SETLOCAL1,/* - x - LOC[1]=x */ |
84 | SETLOCAL2,/* x - LOC[2]=x */ | 84 | SETLOCAL2,/* - x - LOC[2]=x */ |
85 | SETLOCAL3,/* x - LOC[3]=x */ | 85 | SETLOCAL3,/* - x - LOC[3]=x */ |
86 | SETLOCAL4,/* x - LOC[4]=x */ | 86 | SETLOCAL4,/* - x - LOC[4]=x */ |
87 | SETLOCAL5,/* x - LOC[5]=x */ | 87 | SETLOCAL5,/* - x - LOC[5]=x */ |
88 | SETLOCAL6,/* x - LOC[6]=x */ | 88 | SETLOCAL6,/* - x - LOC[6]=x */ |
89 | SETLOCAL7,/* x - LOC[7]=x */ | 89 | SETLOCAL7,/* - x - LOC[7]=x */ |
90 | SETLOCAL8,/* x - LOC[8]=x */ | 90 | SETLOCAL8,/* - x - LOC[8]=x */ |
91 | SETLOCAL9,/* x - LOC[9]=x */ | 91 | SETLOCAL9,/* - x - LOC[9]=x */ |
92 | SETLOCAL,/* b x - LOC[b]=x */ | 92 | SETLOCAL,/* b x - LOC[b]=x */ |
93 | 93 | ||
94 | SETGLOBALB,/* b x - VAR[CNST[b]]=x */ | 94 | SETGLOBALB,/* b x - VAR[CNST[b]]=x */ |
95 | SETGLOBAL,/* w x - VAR[CNST[w]]=x */ | 95 | SETGLOBAL,/* w x - VAR[CNST[w]]=x */ |
96 | 96 | ||
97 | SETTABLE0,/* v i t - t[i]=v */ | 97 | SETTABLE0,/* - v i t - t[i]=v */ |
98 | SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ | 98 | SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ |
99 | 99 | ||
100 | SETLIST0,/* b v_b...v_1 t - t[i]=v_i */ | 100 | SETLIST0,/* b v_b...v_1 t - t[i]=v_i */ |
101 | SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ | 101 | SETLIST,/* b c v_b...v_1 t - t[i+c*FPF]=v_i */ |
102 | SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */ | 102 | SETMAP,/* b v_b k_b ...v_1 k_1 t t t[k_i]=v_i */ |
103 | 103 | ||
104 | EQOP,/* y x (x==y)? 1 : nil */ | 104 | EQOP,/* - y x (x==y)? 1 : nil */ |
105 | NEQOP,/* y x (x~=y)? 1 : nil */ | 105 | NEQOP,/* - y x (x~=y)? 1 : nil */ |
106 | LTOP,/* y x (x<y)? 1 : nil */ | 106 | LTOP,/* - y x (x<y)? 1 : nil */ |
107 | LEOP,/* y x (x<y)? 1 : nil */ | 107 | LEOP,/* - y x (x<y)? 1 : nil */ |
108 | GTOP,/* y x (x>y)? 1 : nil */ | 108 | GTOP,/* - y x (x>y)? 1 : nil */ |
109 | GEOP,/* y x (x>=y)? 1 : nil */ | 109 | GEOP,/* - y x (x>=y)? 1 : nil */ |
110 | ADDOP,/* y x x+y */ | 110 | ADDOP,/* - y x x+y */ |
111 | SUBOP,/* y x x-y */ | 111 | SUBOP,/* - y x x-y */ |
112 | MULTOP,/* y x x*y */ | 112 | MULTOP,/* - y x x*y */ |
113 | DIVOP,/* y x x/y */ | 113 | DIVOP,/* - y x x/y */ |
114 | POWOP,/* y x x^y */ | 114 | POWOP,/* - y x x^y */ |
115 | CONCOP,/* y x x..y */ | 115 | CONCOP,/* - y x x..y */ |
116 | MINUSOP,/* x -x */ | 116 | MINUSOP,/* - x -x */ |
117 | NOTOP,/* x (x==nil)? 1 : nil */ | 117 | NOTOP,/* - x (x==nil)? 1 : nil */ |
118 | 118 | ||
119 | /* NOTICE: all jumps are relative to the position following the opcode */ | ||
120 | ONTJMP,/* b x (x!=nil)? x : - (x!=nil)? PC+=b */ | 119 | ONTJMP,/* b x (x!=nil)? x : - (x!=nil)? PC+=b */ |
121 | ONFJMP,/* b x (x==nil)? x : - (x==nil)? PC+=b */ | 120 | ONFJMP,/* b x (x==nil)? x : - (x==nil)? PC+=b */ |
122 | JMPB,/* b - - PC+=b */ | 121 | JMPB,/* b - - PC+=b */ |
@@ -134,8 +133,8 @@ CLOSURE,/* w v_1...v_n c(CNST[w]) */ | |||
134 | CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ | 133 | CALLFUNC,/* b c v_b...v_1 f r_c...r_1 f(v1,...,v_b) */ |
135 | RETCODE,/* b - - */ | 134 | RETCODE,/* b - - */ |
136 | SETLINE,/* w - - LINE=w */ | 135 | SETLINE,/* w - - LINE=w */ |
137 | POP1,/* - - TOP-=1 */ | 136 | POP1,/* - - - TOP-=1 */ |
138 | POP2,/* - - TOP-=2 */ | 137 | POP2,/* - - - TOP-=2 */ |
139 | POPS,/* b - - TOP-=b */ | 138 | POPS,/* b - - TOP-=b */ |
140 | ARGS,/* b - - TOP=BASE+b */ | 139 | ARGS,/* b - - TOP=BASE+b */ |
141 | VARARGS/* b v_x...v_1 {v_1...v_x;n=x} TOP=BASE+b+1 */ | 140 | 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.6 1997/09/26 15:02:26 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.7 1997/10/01 20:05:34 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 | */ |
@@ -135,31 +135,6 @@ static void code_word (int n) | |||
135 | } | 135 | } |
136 | 136 | ||
137 | 137 | ||
138 | static int fix_opcode (int pc, OpCode op, int n) | ||
139 | { | ||
140 | if (n <= 255) { | ||
141 | currState->f->code[pc] = op; | ||
142 | currState->f->code[pc+1] = n; | ||
143 | return 0; | ||
144 | } | ||
145 | else { | ||
146 | check_pc(1); /* open space */ | ||
147 | movecode_up(pc+1, pc, currState->pc-pc); | ||
148 | currState->pc++; | ||
149 | currState->f->code[pc] = op+1; /* opcode must be word variant */ | ||
150 | code_word_at(pc+1, n); | ||
151 | return 1; | ||
152 | } | ||
153 | } | ||
154 | |||
155 | static int fix_jump (int pc, OpCode op, int n) | ||
156 | { | ||
157 | n -= pc+1; /* jump is relative to position following jump opcode */ | ||
158 | if (n > 255) n++; /* jump must be 1 bigger */ | ||
159 | return fix_opcode(pc, op, n); | ||
160 | } | ||
161 | |||
162 | |||
163 | static void deltastack (int delta) | 138 | static void deltastack (int delta) |
164 | { | 139 | { |
165 | currState->stacksize += delta; | 140 | currState->stacksize += delta; |
@@ -501,6 +476,39 @@ static int lua_codestore (int i, int left) | |||
501 | } | 476 | } |
502 | 477 | ||
503 | 478 | ||
479 | static int fix_opcode (int pc, OpCode op, int n) | ||
480 | { | ||
481 | if (n <= 255) { | ||
482 | currState->f->code[pc] = op; | ||
483 | currState->f->code[pc+1] = n; | ||
484 | return 0; | ||
485 | } | ||
486 | else { | ||
487 | check_pc(1); /* open space */ | ||
488 | movecode_up(pc+1, pc, currState->pc-pc); | ||
489 | currState->pc++; | ||
490 | currState->f->code[pc] = op+1; /* opcode must be word variant */ | ||
491 | code_word_at(pc+1, n); | ||
492 | return 1; | ||
493 | } | ||
494 | } | ||
495 | |||
496 | |||
497 | static int fix_jump (int pc, OpCode op, int n) | ||
498 | { | ||
499 | /* jump is relative to position following jump instruction */ | ||
500 | return fix_opcode(pc, op, n-(pc+JMPSIZE)); | ||
501 | } | ||
502 | |||
503 | |||
504 | static void fix_upjmp (OpCode op, int pos) | ||
505 | { | ||
506 | int delta = currState->pc+JMPSIZE - pos; /* jump is relative */ | ||
507 | if (delta > 255) delta++; | ||
508 | code_opborw(op, delta, 0); | ||
509 | } | ||
510 | |||
511 | |||
504 | static void codeIf (int thenAdd, int elseAdd) | 512 | static void codeIf (int thenAdd, int elseAdd) |
505 | { | 513 | { |
506 | int elseinit = elseAdd+JMPSIZE; | 514 | int elseinit = elseAdd+JMPSIZE; |
@@ -516,7 +524,7 @@ static void codeIf (int thenAdd, int elseAdd) | |||
516 | 524 | ||
517 | static void code_shortcircuit (OpCode op, int pos) | 525 | static void code_shortcircuit (OpCode op, int pos) |
518 | { | 526 | { |
519 | int dist = currState->pc - (pos+1); | 527 | int dist = currState->pc - (pos+JMPSIZE); |
520 | if (dist > 255) | 528 | if (dist > 255) |
521 | luaY_error("and/or expression too long"); | 529 | luaY_error("and/or expression too long"); |
522 | currState->f->code[pos] = op; | 530 | currState->f->code[pos] = op; |
@@ -578,7 +586,6 @@ static void init_func (void) | |||
578 | } | 586 | } |
579 | 587 | ||
580 | 588 | ||
581 | |||
582 | static TProtoFunc *close_func (void) | 589 | static TProtoFunc *close_func (void) |
583 | { | 590 | { |
584 | TProtoFunc *f = currState->f; | 591 | TProtoFunc *f = currState->f; |
@@ -681,12 +688,13 @@ stat : IF cond THEN block SaveWord elsepart END | |||
681 | &currState->f->code[$2], expsize); | 688 | &currState->f->code[$2], expsize); |
682 | movecode_down($2, $3, currState->pc-$2); | 689 | movecode_down($2, $3, currState->pc-$2); |
683 | newpos += fix_jump($2, JMPB, currState->pc-expsize); | 690 | newpos += fix_jump($2, JMPB, currState->pc-expsize); |
684 | code_opborw(IFTUPJMPB, currState->pc+1 - newpos, 0); | 691 | fix_upjmp(IFTUPJMPB, newpos); |
685 | }} | 692 | }} |
686 | 693 | ||
687 | | REPEAT GetPC block UNTIL expr1 | 694 | | REPEAT GetPC block UNTIL expr1 |
688 | { | 695 | { |
689 | code_opborw(IFFUPJMPB, currState->pc+1 - $2, -1); | 696 | fix_upjmp(IFFUPJMPB, $2); |
697 | deltastack(-1); /* pops condition */ | ||
690 | } | 698 | } |
691 | 699 | ||
692 | | varlist1 '=' exprlist1 | 700 | | varlist1 '=' exprlist1 |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.6 1997/09/26 15:02:26 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.7 1997/10/01 20:05:34 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 | */ |
@@ -570,51 +570,51 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
570 | break; | 570 | break; |
571 | 571 | ||
572 | case ONTJMP: | 572 | case ONTJMP: |
573 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += *pc; | 573 | aux = *pc++; |
574 | else { pc++; luaD_stack.top--; } | 574 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux; |
575 | else luaD_stack.top--; | ||
575 | break; | 576 | break; |
576 | 577 | ||
577 | case ONFJMP: | 578 | case ONFJMP: |
578 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += *pc; | 579 | aux = *pc++; |
579 | else { pc++; luaD_stack.top--; } | 580 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux; |
580 | break; | 581 | else luaD_stack.top--; |
581 | |||
582 | case JMPB: | ||
583 | pc += *pc; | ||
584 | break; | 582 | break; |
585 | 583 | ||
586 | case JMP: | 584 | case JMP: |
587 | pc += get_word(pc); | 585 | aux = next_word(pc); goto jmp; |
588 | break; | ||
589 | 586 | ||
590 | case IFFJMPB: | 587 | case JMPB: |
591 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += *pc; | 588 | aux = *pc++; |
592 | else pc++; | 589 | jmp: |
590 | pc += aux; | ||
593 | break; | 591 | break; |
594 | 592 | ||
595 | case IFFJMP: | 593 | case IFFJMP: |
596 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += get_word(pc); | 594 | aux = next_word(pc); goto iffjmp; |
597 | else skip_word(pc); | ||
598 | break; | ||
599 | 595 | ||
600 | case IFTUPJMPB: | 596 | case IFFJMPB: |
601 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= *pc; | 597 | aux = *pc++; |
602 | else pc++; | 598 | iffjmp: |
599 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux; | ||
603 | break; | 600 | break; |
604 | 601 | ||
605 | case IFTUPJMP: | 602 | case IFTUPJMP: |
606 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= get_word(pc); | 603 | aux = next_word(pc); goto iftupjmp; |
607 | else skip_word(pc); | ||
608 | break; | ||
609 | 604 | ||
610 | case IFFUPJMPB: | 605 | case IFTUPJMPB: |
611 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= *pc; | 606 | aux = *pc++; |
612 | else pc++; | 607 | iftupjmp: |
608 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux; | ||
613 | break; | 609 | break; |
614 | 610 | ||
615 | case IFFUPJMP: | 611 | case IFFUPJMP: |
616 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= get_word(pc); | 612 | aux = next_word(pc); goto iffupjmp; |
617 | else skip_word(pc); | 613 | |
614 | case IFFUPJMPB: | ||
615 | aux = *pc++; | ||
616 | iffupjmp: | ||
617 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; | ||
618 | break; | 618 | break; |
619 | 619 | ||
620 | case CLOSURE: | 620 | case CLOSURE: |