aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lcode.c10
-rw-r--r--ldebug.c11
-rw-r--r--lopcodes.h21
-rw-r--r--lvm.c6
4 files changed, 32 insertions, 16 deletions
diff --git a/lcode.c b/lcode.c
index 8ea811d8..b1a8a855 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.2 2004/04/30 20:13:38 roberto Exp roberto $ 2** $Id: lcode.c,v 2.3 2004/05/31 18:51:50 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*/
@@ -418,16 +418,16 @@ int luaK_exp2RK (FuncState *fs, expdesc *e) {
418 luaK_exp2val(fs, e); 418 luaK_exp2val(fs, e);
419 switch (e->k) { 419 switch (e->k) {
420 case VNIL: { 420 case VNIL: {
421 if (fs->nk + MAXSTACK <= MAXARG_C) { /* constant fit in argC? */ 421 if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */
422 e->info = nil_constant(fs); 422 e->info = nil_constant(fs);
423 e->k = VK; 423 e->k = VK;
424 return e->info + MAXSTACK; 424 return RKASK(e->info);
425 } 425 }
426 else break; 426 else break;
427 } 427 }
428 case VK: { 428 case VK: {
429 if (e->info + MAXSTACK <= MAXARG_C) /* constant fit in argC? */ 429 if (e->info <= MAXINDEXRK) /* constant fit in argC? */
430 return e->info + MAXSTACK; 430 return RKASK(e->info);
431 else break; 431 else break;
432 } 432 }
433 default: break; 433 default: break;
diff --git a/ldebug.c b/ldebug.c
index 9fca89ec..eea8669f 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.5 2004/05/31 18:51:50 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.6 2004/06/02 19:07:55 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -276,8 +276,8 @@ static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
276 case OpArgN: check(r == 0); break; 276 case OpArgN: check(r == 0); break;
277 case OpArgU: break; 277 case OpArgU: break;
278 case OpArgR: checkreg(pt, r); break; 278 case OpArgR: checkreg(pt, r); break;
279 case OpArgK: 279 case OpArgK:
280 check(r < pt->maxstacksize || (r >= MAXSTACK && r-MAXSTACK < pt->sizek)); 280 check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize);
281 break; 281 break;
282 } 282 }
283 return 1; 283 return 1;
@@ -432,9 +432,8 @@ int luaG_checkcode (const Proto *pt) {
432 432
433 433
434static const char *kname (Proto *p, int c) { 434static const char *kname (Proto *p, int c) {
435 c = c - MAXSTACK; 435 if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))
436 if (c >= 0 && ttisstring(&p->k[c])) 436 return svalue(&p->k[INDEXK(c)]);
437 return svalue(&p->k[c]);
438 else 437 else
439 return "?"; 438 return "?";
440} 439}
diff --git a/lopcodes.h b/lopcodes.h
index 8fdaf6b1..c9225c5c 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.h,v 1.108 2004/05/17 12:34:00 roberto Exp roberto $ 2** $Id: lopcodes.h,v 1.109 2004/05/31 18:51:50 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*/
@@ -109,6 +109,23 @@ enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */
109 | (cast(Instruction, bc)<<POS_Bx)) 109 | (cast(Instruction, bc)<<POS_Bx))
110 110
111 111
112/*
113** Macros to operate RK indices
114*/
115
116/* this bit 1 means constant (0 means register) */
117#define BITRK (1 << (SIZE_B - 1))
118
119/* test whether value is a constant */
120#define ISK(x) ((x) & BITRK)
121
122/* gets the index of the constant */
123#define INDEXK(r) ((int)(r) & ~BITRK)
124
125#define MAXINDEXRK (BITRK - 1)
126
127/* code a constant index as a RK value */
128#define RKASK(x) ((x) | BITRK)
112 129
113 130
114/* 131/*
@@ -120,7 +137,7 @@ enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */
120/* 137/*
121** R(x) - register 138** R(x) - register
122** Kst(x) - constant (in constant table) 139** Kst(x) - constant (in constant table)
123** RK(x) == if x < MAXSTACK then R(x) else Kst(x-MAXSTACK) 140** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)
124*/ 141*/
125 142
126 143
diff --git a/lvm.c b/lvm.c
index 8db4468f..69aa740a 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.9 2004/06/08 16:23:58 roberto Exp roberto $ 2** $Id: lvm.c,v 2.10 2004/06/29 17:05:00 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*/
@@ -369,9 +369,9 @@ static StkId Arith (lua_State *L, StkId ra, const TValue *rb,
369#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) 369#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
370#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) 370#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
371#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ 371#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
372 (GETARG_B(i) < MAXSTACK) ? base+GETARG_B(i) : k+GETARG_B(i)-MAXSTACK) 372 ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))
373#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ 373#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \
374 (GETARG_C(i) < MAXSTACK) ? base+GETARG_C(i) : k+GETARG_C(i)-MAXSTACK) 374 ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))
375#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) 375#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))
376 376
377 377