diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-28 17:57:45 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-28 17:57:45 -0300 |
commit | 502a1d1108d4e3b97e012d2ed9a496fd003b08db (patch) | |
tree | 0d1daa63ebe8af89a35ec5ecbc48f7e055eb0374 /lparser.h | |
parent | 173e41b2ebed59a716d299470de25e50aee3b921 (diff) | |
download | lua-github-502a1d1108d4e3b97e012d2ed9a496fd003b08db.tar.gz |
new opcodes for table access with constant keys (strings and integers)
Diffstat (limited to 'lparser.h')
-rw-r--r-- | lparser.h | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -1,5 +1,5 @@ /* -** $Id: lparser.h,v 1.75 2015/12/17 15:44:50 roberto Exp roberto $ +** $Id: lparser.h,v 1.76 2015/12/30 18:16:13 roberto Exp roberto $ ** Lua Parser ** See Copyright Notice in lua.h */ @@ -36,9 +36,17 @@ typedef enum { VLOCAL, /* local variable; info = local register */ VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ VINDEXED, /* indexed variable; - ind.vt = whether 't' is register or upvalue; - ind.t = table register or upvalue; - ind.idx = key's R/K index */ + ind.t = table register; + ind.idx = key's R index */ + VINDEXUP, /* indexed upvalue; + ind.t = table upvalue; + ind.idx = key's K index */ + VINDEXI, /* indexed variable with constant integer; + ind.t = table register; + ind.idx = key's value */ + VINDEXSTR, /* indexed variable with literal string; + ind.t = table register; + ind.idx = key's K index */ VJMP, /* expression is a test/comparison; info = pc of corresponding jump instruction */ VRELOCABLE, /* expression can put result in any register; @@ -48,7 +56,8 @@ typedef enum { } expkind; -#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED) +#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) +#define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) #define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL) typedef struct expdesc { @@ -57,10 +66,9 @@ typedef struct expdesc { lua_Integer ival; /* for VKINT */ lua_Number nval; /* for VKFLT */ int info; /* for generic use */ - struct { /* for indexed variables (VINDEXED) */ - short idx; /* index (R/K) */ + struct { /* for indexed variables */ + short idx; /* index (R or "long" K) */ lu_byte t; /* table (register or upvalue) */ - lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */ } ind; } u; int t; /* patch list of 'exit when true' */ |