diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-29 14:26:48 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-29 14:26:48 -0300 |
| commit | a006514ea138a29b6031058d9002b48a572b5dd6 (patch) | |
| tree | b289a8af0c0497f2555784a0cf666659ceab0236 /lopcodes.h | |
| parent | 6e9b719694bffb8de711f182d405ec37d32ae0b1 (diff) | |
| download | lua-a006514ea138a29b6031058d9002b48a572b5dd6.tar.gz lua-a006514ea138a29b6031058d9002b48a572b5dd6.tar.bz2 lua-a006514ea138a29b6031058d9002b48a572b5dd6.zip | |
Big revamp in the implmentation of labels/gotos
Added restriction that, when a label is created, there cannot be
another label with the same name visible. That allows backward goto's
to be resolved when they are read. Backward goto's get a close if
they jump out of the scope of some variable; labels get a close only
if previous goto to it jumps out of the scope of some upvalue.
Diffstat (limited to 'lopcodes.h')
| -rw-r--r-- | lopcodes.h | 9 |
1 files changed, 3 insertions, 6 deletions
| @@ -21,7 +21,7 @@ iABC C(8) | B(8) |k| A(8) | Op(7) | | |||
| 21 | iABx Bx(17) | A(8) | Op(7) | | 21 | iABx Bx(17) | A(8) | Op(7) | |
| 22 | iAsB sBx (signed)(17) | A(8) | Op(7) | | 22 | iAsB sBx (signed)(17) | A(8) | Op(7) | |
| 23 | iAx Ax(25) | Op(7) | | 23 | iAx Ax(25) | Op(7) | |
| 24 | isJ sJ(24) |m| Op(7) | | 24 | isJ sJ(25) | Op(7) | |
| 25 | 25 | ||
| 26 | A signed argument is represented in excess K: the represented value is | 26 | A signed argument is represented in excess K: the represented value is |
| 27 | the written unsigned value minus K, where K is half the maximum for the | 27 | the written unsigned value minus K, where K is half the maximum for the |
| @@ -40,7 +40,7 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
| 40 | #define SIZE_Bx (SIZE_C + SIZE_B + 1) | 40 | #define SIZE_Bx (SIZE_C + SIZE_B + 1) |
| 41 | #define SIZE_A 8 | 41 | #define SIZE_A 8 |
| 42 | #define SIZE_Ax (SIZE_Bx + SIZE_A) | 42 | #define SIZE_Ax (SIZE_Bx + SIZE_A) |
| 43 | #define SIZE_sJ (SIZE_Bx + SIZE_A - 1) | 43 | #define SIZE_sJ (SIZE_Bx + SIZE_A) |
| 44 | 44 | ||
| 45 | #define SIZE_OP 7 | 45 | #define SIZE_OP 7 |
| 46 | 46 | ||
| @@ -55,8 +55,7 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
| 55 | 55 | ||
| 56 | #define POS_Ax POS_A | 56 | #define POS_Ax POS_A |
| 57 | 57 | ||
| 58 | #define POS_m POS_A | 58 | #define POS_sJ POS_A |
| 59 | #define POS_sJ (POS_A + 1) | ||
| 60 | 59 | ||
| 61 | /* | 60 | /* |
| 62 | ** limits for opcode arguments. | 61 | ** limits for opcode arguments. |
| @@ -144,8 +143,6 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
| 144 | check_exp(checkopm(i, isJ), getarg(i, POS_sJ, SIZE_sJ) - OFFSET_sJ) | 143 | check_exp(checkopm(i, isJ), getarg(i, POS_sJ, SIZE_sJ) - OFFSET_sJ) |
| 145 | #define SETARG_sJ(i,j) \ | 144 | #define SETARG_sJ(i,j) \ |
| 146 | setarg(i, cast_uint((j)+OFFSET_sJ), POS_sJ, SIZE_sJ) | 145 | setarg(i, cast_uint((j)+OFFSET_sJ), POS_sJ, SIZE_sJ) |
| 147 | #define GETARG_m(i) check_exp(checkopm(i, isJ), getarg(i, POS_m, 1)) | ||
| 148 | #define SETARG_m(i,m) setarg(i, m, POS_m, 1) | ||
| 149 | 146 | ||
| 150 | 147 | ||
| 151 | #define CREATE_ABCk(o,a,b,c,k) ((cast(Instruction, o)<<POS_OP) \ | 148 | #define CREATE_ABCk(o,a,b,c,k) ((cast(Instruction, o)<<POS_OP) \ |
