diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-06-29 15:49:02 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-06-29 15:49:02 -0300 |
| commit | 02a2c01ccd4dda04636a30cb60b6dd52511fd790 (patch) | |
| tree | e2d76d2647ca613715738f37ba1d532a149a187e | |
| parent | 23e08a68f51b36506c5ee8571e9dca01d67b7454 (diff) | |
| download | lua-02a2c01ccd4dda04636a30cb60b6dd52511fd790.tar.gz lua-02a2c01ccd4dda04636a30cb60b6dd52511fd790.tar.bz2 lua-02a2c01ccd4dda04636a30cb60b6dd52511fd790.zip | |
new way to code RK values
| -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 | ||
