diff options
-rw-r--r-- | lcode.c | 10 | ||||
-rw-r--r-- | ldebug.c | 11 | ||||
-rw-r--r-- | lopcodes.h | 21 | ||||
-rw-r--r-- | lvm.c | 6 |
4 files changed, 32 insertions, 16 deletions
@@ -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; |
@@ -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 | ||
434 | static const char *kname (Proto *p, int c) { | 434 | static 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 | } |
@@ -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 | ||
@@ -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 | ||