aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-09-28 13:53:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-09-28 13:53:29 -0300
commit722bdbe17d0192baf72978f88069d12a921e9bfb (patch)
tree78da619d4799721e67a760bf4220b568f636cb86
parent1b100335839e13021b4731f0407b87e4f7544dc0 (diff)
downloadlua-722bdbe17d0192baf72978f88069d12a921e9bfb.tar.gz
lua-722bdbe17d0192baf72978f88069d12a921e9bfb.tar.bz2
lua-722bdbe17d0192baf72978f88069d12a921e9bfb.zip
no more 'getBMode'-'getCMode' (imprecise + we will need more space
for op mode) + better control of op modes
-rw-r--r--lcode.c18
-rw-r--r--lcode.h4
-rw-r--r--lopcodes.c116
-rw-r--r--lopcodes.h57
-rw-r--r--lparser.c4
-rw-r--r--lvm.c19
6 files changed, 109 insertions, 109 deletions
diff --git a/lcode.c b/lcode.c
index 775a22c3..1f6e9c11 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.124 2017/09/26 17:10:49 roberto Exp roberto $ 2** $Id: lcode.c,v 2.125 2017/09/26 18:14:45 roberto Exp roberto $
3** Code generator for Lua 3** Code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -367,8 +367,6 @@ static int luaK_code (FuncState *fs, Instruction i) {
367*/ 367*/
368int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { 368int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
369 lua_assert(getOpMode(o) == iABC); 369 lua_assert(getOpMode(o) == iABC);
370 lua_assert(getBMode(o) != OpArgN || b == 0);
371 lua_assert(getCMode(o) != OpArgN || c == 0);
372 lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C); 370 lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C);
373 return luaK_code(fs, CREATE_ABC(o, a, b, c)); 371 return luaK_code(fs, CREATE_ABC(o, a, b, c));
374} 372}
@@ -378,14 +376,24 @@ int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
378** Format and emit an 'iABx' instruction. 376** Format and emit an 'iABx' instruction.
379*/ 377*/
380int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { 378int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
381 lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); 379 lua_assert(getOpMode(o) == iABx);
382 lua_assert(getCMode(o) == OpArgN);
383 lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); 380 lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx);
384 return luaK_code(fs, CREATE_ABx(o, a, bc)); 381 return luaK_code(fs, CREATE_ABx(o, a, bc));
385} 382}
386 383
387 384
388/* 385/*
386** Format and emit an 'iAsBx' instruction.
387*/
388int luaK_codeAsBx (FuncState *fs, OpCode o, int a, int bc) {
389 unsigned int b = bc + MAXARG_sBx;
390 lua_assert(getOpMode(o) == iAsBx);
391 lua_assert(a <= MAXARG_A && b <= MAXARG_Bx);
392 return luaK_code(fs, CREATE_ABx(o, a, b));
393}
394
395
396/*
389** Emit an "extra argument" instruction (format 'iAx') 397** Emit an "extra argument" instruction (format 'iAx')
390*/ 398*/
391static int codeextraarg (FuncState *fs, int a) { 399static int codeextraarg (FuncState *fs, int a) {
diff --git a/lcode.h b/lcode.h
index 70953559..e7f048fd 100644
--- a/lcode.h
+++ b/lcode.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.h,v 1.65 2017/04/20 19:53:55 roberto Exp roberto $ 2** $Id: lcode.h,v 1.66 2017/09/13 19:50:08 roberto Exp roberto $
3** Code generator for Lua 3** Code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -43,13 +43,13 @@ typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
43/* get (pointer to) instruction of given 'expdesc' */ 43/* get (pointer to) instruction of given 'expdesc' */
44#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info]) 44#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info])
45 45
46#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
47 46
48#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) 47#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET)
49 48
50#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) 49#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t)
51 50
52LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); 51LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
52LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx);
53LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); 53LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
54LUAI_FUNC void luaK_fixline (FuncState *fs, int line); 54LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
55LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); 55LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
diff --git a/lopcodes.c b/lopcodes.c
index 9617b720..5051f2a8 100644
--- a/lopcodes.c
+++ b/lopcodes.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.c,v 1.63 2017/09/19 18:38:14 roberto Exp roberto $ 2** $Id: lopcodes.c,v 1.64 2017/09/26 18:14:45 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*/
@@ -77,64 +77,62 @@ LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {
77}; 77};
78 78
79 79
80#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
81
82LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { 80LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
83/* T A B C mode opcode */ 81/* T A mode opcode */
84 opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ 82 opmode(0, 1, iABC) /* OP_MOVE */
85 ,opmode(0, 1, OpArgU, OpArgN, iAsBx) /* OP_LOADI */ 83 ,opmode(0, 1, iAsBx) /* OP_LOADI */
86 ,opmode(0, 1, OpArgU, OpArgN, iAsBx) /* OP_LOADF */ 84 ,opmode(0, 1, iAsBx) /* OP_LOADF */
87 ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ 85 ,opmode(0, 1, iABx) /* OP_LOADK */
88 ,opmode(0, 1, OpArgN, OpArgN, iABx) /* OP_LOADKX */ 86 ,opmode(0, 1, iABx) /* OP_LOADKX */
89 ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ 87 ,opmode(0, 1, iABC) /* OP_LOADBOOL */
90 ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_LOADNIL */ 88 ,opmode(0, 1, iABC) /* OP_LOADNIL */
91 ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ 89 ,opmode(0, 1, iABC) /* OP_GETUPVAL */
92 ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ 90 ,opmode(0, 0, iABC) /* OP_SETUPVAL */
93 ,opmode(0, 1, OpArgU, OpArgK, iABC) /* OP_GETTABUP */ 91 ,opmode(0, 1, iABC) /* OP_GETTABUP */
94 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_GETTABLE */ 92 ,opmode(0, 1, iABC) /* OP_GETTABLE */
95 ,opmode(0, 1, OpArgR, OpArgU, iABC) /* OP_GETI */ 93 ,opmode(0, 1, iABC) /* OP_GETI */
96 ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETFIELD */ 94 ,opmode(0, 1, iABC) /* OP_GETFIELD */
97 ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABUP */ 95 ,opmode(0, 0, iABC) /* OP_SETTABUP */
98 ,opmode(0, 0, OpArgR, OpArgK, iABC) /* OP_SETTABLE */ 96 ,opmode(0, 0, iABC) /* OP_SETTABLE */
99 ,opmode(0, 0, OpArgU, OpArgK, iABC) /* OP_SETI */ 97 ,opmode(0, 0, iABC) /* OP_SETI */
100 ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETFIELD */ 98 ,opmode(0, 0, iABC) /* OP_SETFIELD */
101 ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ 99 ,opmode(0, 1, iABC) /* OP_NEWTABLE */
102 ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ 100 ,opmode(0, 1, iABC) /* OP_SELF */
103 ,opmode(0, 1, OpArgR, OpArgU, iABC) /* OP_ADDI */ 101 ,opmode(0, 1, iABC) /* OP_ADDI */
104 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_ADD */ 102 ,opmode(0, 1, iABC) /* OP_ADD */
105 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SUB */ 103 ,opmode(0, 1, iABC) /* OP_SUB */
106 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_MUL */ 104 ,opmode(0, 1, iABC) /* OP_MUL */
107 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_MOD */ 105 ,opmode(0, 1, iABC) /* OP_MOD */
108 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_POW */ 106 ,opmode(0, 1, iABC) /* OP_POW */
109 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_DIV */ 107 ,opmode(0, 1, iABC) /* OP_DIV */
110 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_IDIV */ 108 ,opmode(0, 1, iABC) /* OP_IDIV */
111 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BAND */ 109 ,opmode(0, 1, iABC) /* OP_BAND */
112 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BOR */ 110 ,opmode(0, 1, iABC) /* OP_BOR */
113 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BXOR */ 111 ,opmode(0, 1, iABC) /* OP_BXOR */
114 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SHL */ 112 ,opmode(0, 1, iABC) /* OP_SHL */
115 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SHR */ 113 ,opmode(0, 1, iABC) /* OP_SHR */
116 ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ 114 ,opmode(0, 1, iABC) /* OP_UNM */
117 ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_BNOT */ 115 ,opmode(0, 1, iABC) /* OP_BNOT */
118 ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ 116 ,opmode(0, 1, iABC) /* OP_NOT */
119 ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ 117 ,opmode(0, 1, iABC) /* OP_LEN */
120 ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ 118 ,opmode(0, 1, iABC) /* OP_CONCAT */
121 ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */ 119 ,opmode(0, 0, iABC) /* OP_CLOSE */
122 ,opmode(0, 0, OpArgU, OpArgN, iAsBx) /* OP_JMP */ 120 ,opmode(0, 0, iAsBx) /* OP_JMP */
123 ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_EQ */ 121 ,opmode(1, 0, iABC) /* OP_EQ */
124 ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_LT */ 122 ,opmode(1, 0, iABC) /* OP_LT */
125 ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_LE */ 123 ,opmode(1, 0, iABC) /* OP_LE */
126 ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TEST */ 124 ,opmode(1, 0, iABC) /* OP_TEST */
127 ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ 125 ,opmode(1, 1, iABC) /* OP_TESTSET */
128 ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ 126 ,opmode(0, 1, iABC) /* OP_CALL */
129 ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ 127 ,opmode(0, 1, iABC) /* OP_TAILCALL */
130 ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ 128 ,opmode(0, 0, iABC) /* OP_RETURN */
131 ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_FORLOOP */ 129 ,opmode(0, 1, iABx) /* OP_FORLOOP */
132 ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_FORPREP */ 130 ,opmode(0, 1, iABx) /* OP_FORPREP */
133 ,opmode(0, 0, OpArgN, OpArgU, iABC) /* OP_TFORCALL */ 131 ,opmode(0, 0, iABC) /* OP_TFORCALL */
134 ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_TFORLOOP */ 132 ,opmode(0, 1, iABx) /* OP_TFORLOOP */
135 ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ 133 ,opmode(0, 0, iABC) /* OP_SETLIST */
136 ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ 134 ,opmode(0, 1, iABx) /* OP_CLOSURE */
137 ,opmode(0, 1, OpArgU, OpArgR, iABC) /* OP_VARARG */ 135 ,opmode(0, 1, iABC) /* OP_VARARG */
138 ,opmode(0, 0, OpArgU, OpArgU, iAx) /* OP_EXTRAARG */ 136 ,opmode(0, 0, iAx) /* OP_EXTRAARG */
139}; 137};
140 138
diff --git a/lopcodes.h b/lopcodes.h
index d28948d8..6b9c3aeb 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.h,v 1.160 2017/09/19 18:38:14 roberto Exp roberto $ 2** $Id: lopcodes.h,v 1.161 2017/09/26 18:14:45 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*/
@@ -89,6 +89,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */
89#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ 89#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \
90 ((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP)))) 90 ((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))
91 91
92#define checkopm(i,m) (getOpMode(GET_OPCODE(i)) == m)
93
94
92#define getarg(i,pos,size) (cast(int, ((i)>>(pos)) & MASK1(size,0))) 95#define getarg(i,pos,size) (cast(int, ((i)>>(pos)) & MASK1(size,0)))
93#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ 96#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \
94 ((cast(Instruction, v)<<pos)&MASK1(size,pos)))) 97 ((cast(Instruction, v)<<pos)&MASK1(size,pos))))
@@ -96,25 +99,28 @@ enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */
96#define GETARG_A(i) getarg(i, POS_A, SIZE_A) 99#define GETARG_A(i) getarg(i, POS_A, SIZE_A)
97#define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A) 100#define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A)
98 101
99#define GETARG_B(i) getarg(i, POS_B, SIZE_B) 102#define GETARG_B(i) check_exp(checkopm(i, iABC), getarg(i, POS_B, SIZE_B))
100#define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B) 103#define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B)
101 104
102#define GETARG_Br(i) getarg(i, POS_B, SIZE_B - 1) 105#define GETARG_Br(i) \
106 check_exp(checkopm(i, iABC), getarg(i, POS_B, SIZE_B - 1))
103#define GETARG_Bk(i) getarg(i, (POS_B + SIZE_B - 1), 1) 107#define GETARG_Bk(i) getarg(i, (POS_B + SIZE_B - 1), 1)
104 108
105#define GETARG_C(i) getarg(i, POS_C, SIZE_C) 109#define GETARG_C(i) check_exp(checkopm(i, iABC), getarg(i, POS_C, SIZE_C))
106#define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C) 110#define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C)
107 111
108#define GETARG_Cr(i) getarg(i, POS_C, SIZE_C - 1) 112#define GETARG_Cr(i) \
113 check_exp(checkopm(i, iABC), getarg(i, POS_C, SIZE_C - 1))
109#define GETARG_Ck(i) getarg(i, (POS_C + SIZE_C - 1), 1) 114#define GETARG_Ck(i) getarg(i, (POS_C + SIZE_C - 1), 1)
110 115
111#define GETARG_Bx(i) getarg(i, POS_Bx, SIZE_Bx) 116#define GETARG_Bx(i) check_exp(checkopm(i, iABx), getarg(i, POS_Bx, SIZE_Bx))
112#define SETARG_Bx(i,v) setarg(i, v, POS_Bx, SIZE_Bx) 117#define SETARG_Bx(i,v) setarg(i, v, POS_Bx, SIZE_Bx)
113 118
114#define GETARG_Ax(i) getarg(i, POS_Ax, SIZE_Ax) 119#define GETARG_Ax(i) check_exp(checkopm(i, iAx), getarg(i, POS_Ax, SIZE_Ax))
115#define SETARG_Ax(i,v) setarg(i, v, POS_Ax, SIZE_Ax) 120#define SETARG_Ax(i,v) setarg(i, v, POS_Ax, SIZE_Ax)
116 121
117#define GETARG_sBx(i) (GETARG_Bx(i)-MAXARG_sBx) 122#define GETARG_sBx(i) \
123 check_exp(checkopm(i, iAsBx), getarg(i, POS_Bx, SIZE_Bx) - MAXARG_sBx)
118#define SETARG_sBx(i,b) SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx)) 124#define SETARG_sBx(i,b) SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))
119 125
120 126
@@ -160,8 +166,8 @@ enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */
160 166
161/* 167/*
162** R(x) - register 168** R(x) - register
163** Kst(x) - constant (in constant table) 169** K(x) - constant (in constant table)
164** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x) 170** RK(x) == if ISK(x) then K(INDEXK(x)) else R(x)
165*/ 171*/
166 172
167 173
@@ -176,8 +182,8 @@ name args description
176OP_MOVE,/* A B R(A) := R(B) */ 182OP_MOVE,/* A B R(A) := R(B) */
177OP_LOADI,/* A sBx R(A) := sBx */ 183OP_LOADI,/* A sBx R(A) := sBx */
178OP_LOADF,/* A sBx R(A) := (lua_Number)sBx */ 184OP_LOADF,/* A sBx R(A) := (lua_Number)sBx */
179OP_LOADK,/* A Bx R(A) := Kst(Bx) */ 185OP_LOADK,/* A Bx R(A) := K(Bx) */
180OP_LOADKX,/* A R(A) := Kst(extra arg) */ 186OP_LOADKX,/* A R(A) := K(extra arg) */
181OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */ 187OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */
182OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */ 188OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */
183OP_GETUPVAL,/* A B R(A) := UpValue[B] */ 189OP_GETUPVAL,/* A B R(A) := UpValue[B] */
@@ -186,7 +192,7 @@ OP_SETUPVAL,/* A B UpValue[B] := R(A) */
186OP_GETTABUP,/* A B C R(A) := UpValue[B][K(C):string] */ 192OP_GETTABUP,/* A B C R(A) := UpValue[B][K(C):string] */
187OP_GETTABLE,/* A B C R(A) := R(B)[R(C)] */ 193OP_GETTABLE,/* A B C R(A) := R(B)[R(C)] */
188OP_GETI,/* A B C R(A) := R(B)[C] */ 194OP_GETI,/* A B C R(A) := R(B)[C] */
189OP_GETFIELD,/* A B C R(A) := R(B)[Kst(C):string] */ 195OP_GETFIELD,/* A B C R(A) := R(B)[K(C):string] */
190 196
191OP_SETTABUP,/* A B C UpValue[A][K(B):string] := RK(C) */ 197OP_SETTABUP,/* A B C UpValue[A][K(B):string] := RK(C) */
192OP_SETTABLE,/* A B C R(A)[R(B)] := RK(C) */ 198OP_SETTABLE,/* A B C R(A)[R(B)] := RK(C) */
@@ -277,27 +283,18 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
277 283
278/* 284/*
279** masks for instruction properties. The format is: 285** masks for instruction properties. The format is:
280** bits 0-1: op mode 286** bits 0-2: op mode
281** bits 2-3: C arg mode 287** bit 3: instruction set register A
282** bits 4-5: B arg mode 288** bit 4: operator is a test (next instruction must be a jump)
283** bit 6: instruction set register A
284** bit 7: operator is a test (next instruction must be a jump)
285*/ 289*/
286 290
287enum OpArgMask {
288 OpArgN, /* argument is not used */
289 OpArgU, /* argument is used */
290 OpArgR, /* argument is a register or a jump offset */
291 OpArgK /* argument is a constant or register/constant */
292};
293
294LUAI_DDEC const lu_byte luaP_opmodes[NUM_OPCODES]; 291LUAI_DDEC const lu_byte luaP_opmodes[NUM_OPCODES];
295 292
296#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) 293#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7))
297#define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3)) 294#define testAMode(m) (luaP_opmodes[m] & (1 << 3))
298#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) 295#define testTMode(m) (luaP_opmodes[m] & (1 << 4))
299#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) 296
300#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) 297#define opmode(t,a,m) (((t)<<4) | ((a)<<3) | (m))
301 298
302 299
303LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ 300LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */
diff --git a/lparser.c b/lparser.c
index 7fd62f50..1831ea01 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 2.164 2017/08/14 18:33:14 roberto Exp roberto $ 2** $Id: lparser.c,v 2.165 2017/09/13 19:50:08 roberto Exp roberto $
3** Lua Parser 3** Lua Parser
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1373,7 +1373,7 @@ static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {
1373 luaK_patchtohere(fs, prep); 1373 luaK_patchtohere(fs, prep);
1374 luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); 1374 luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
1375 luaK_fixline(fs, line); 1375 luaK_fixline(fs, line);
1376 endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP); 1376 endfor = luaK_codeABx(fs, OP_TFORLOOP, base + 2, 0);
1377 } 1377 }
1378 fixforjump(fs, endfor, prep + 1, 1); 1378 fixforjump(fs, endfor, prep + 1, 1);
1379 luaK_fixline(fs, line); 1379 luaK_fixline(fs, line);
diff --git a/lvm.c b/lvm.c
index f34f3dfe..fd02ad5b 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.294 2017/09/26 18:14:45 roberto Exp roberto $ 2** $Id: lvm.c,v 2.295 2017/09/27 18:59:08 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*/
@@ -733,14 +733,13 @@ void luaV_finishOp (lua_State *L) {
733 733
734 734
735#define RA(i) (base+GETARG_A(i)) 735#define RA(i) (base+GETARG_A(i))
736#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) 736#define RB(i) (base+GETARG_Br(i))
737#define vRB(i) s2v(RB(i)) 737#define vRB(i) s2v(RB(i))
738#define KB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_B(i)) 738#define KB(i) (k+GETARG_B(i))
739#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) 739#define RC(i) (base+GETARG_C(i))
740#define vRC(i) s2v(RC(i)) 740#define vRC(i) s2v(RC(i))
741#define KC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, k+GETARG_C(i)) 741#define KC(i) (k+GETARG_C(i))
742#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ 742#define RKC(i) ((GETARG_Ck(i)) ? k + GETARG_Cr(i) : s2v(base + GETARG_Cr(i)))
743 (GETARG_Ck(i)) ? k + GETARG_Cr(i) : s2v(base + GETARG_Cr(i)))
744 743
745 744
746 745
@@ -834,8 +833,7 @@ void luaV_execute (lua_State *L) {
834 } 833 }
835 vmcase(OP_LOADKX) { 834 vmcase(OP_LOADKX) {
836 TValue *rb; 835 TValue *rb;
837 lua_assert(GET_OPCODE(*pc) == OP_EXTRAARG); 836 rb = k + GETARG_Ax(*pc); pc++;
838 rb = k + GETARG_Ax(*pc++);
839 setobj2s(L, ra, rb); 837 setobj2s(L, ra, rb);
840 vmbreak; 838 vmbreak;
841 } 839 }
@@ -1409,8 +1407,7 @@ void luaV_execute (lua_State *L) {
1409 Table *h; 1407 Table *h;
1410 if (n == 0) n = cast_int(L->top - ra) - 1; 1408 if (n == 0) n = cast_int(L->top - ra) - 1;
1411 if (c == 0) { 1409 if (c == 0) {
1412 lua_assert(GET_OPCODE(*pc) == OP_EXTRAARG); 1410 c = GETARG_Ax(*pc); pc++;
1413 c = GETARG_Ax(*pc++);
1414 } 1411 }
1415 h = hvalue(s2v(ra)); 1412 h = hvalue(s2v(ra));
1416 last = ((c-1)*LFIELDS_PER_FLUSH) + n; 1413 last = ((c-1)*LFIELDS_PER_FLUSH) + n;