diff options
author | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
commit | cead25f928ac606fc1a13882b818913aab3635a9 (patch) | |
tree | 92121b401f76f4b2891ebac0f710b0a921ce13b1 /src/lj_meta.c | |
parent | c031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff) | |
download | luajit2-cead25f928ac606fc1a13882b818913aab3635a9.tar.gz |
DUALNUM: Handle integer type in x86/x64 interpreter and libraries.
Diffstat (limited to 'src/lj_meta.c')
-rw-r--r-- | src/lj_meta.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/lj_meta.c b/src/lj_meta.c index 32024e85..23f11f58 100644 --- a/src/lj_meta.c +++ b/src/lj_meta.c @@ -385,10 +385,21 @@ void lj_meta_call(lua_State *L, TValue *func, TValue *top) } /* Helper for FORI. Coercion. */ -void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *base) +void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o) { - if (!str2num(base, base)) lj_err_msg(L, LJ_ERR_FORINIT); - if (!str2num(base+1, base+1)) lj_err_msg(L, LJ_ERR_FORLIM); - if (!str2num(base+2, base+2)) lj_err_msg(L, LJ_ERR_FORSTEP); + if (!(tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o)))) + lj_err_msg(L, LJ_ERR_FORINIT); + if (!(tvisnumber(o+1) || (tvisstr(o+1) && lj_str_tonumber(strV(o+1), o+1)))) + lj_err_msg(L, LJ_ERR_FORLIM); + if (!(tvisnumber(o+2) || (tvisstr(o+2) && lj_str_tonumber(strV(o+2), o+2)))) + lj_err_msg(L, LJ_ERR_FORSTEP); +#if LJ_DUALNUM + /* Ensure all slots are integers or all slots are numbers. */ + if (!(tvisint(o) && tvisint(o+1) && tvisint(o+2))) { + if (tvisint(o)) setnumV(o, (lua_Number)intV(o)); + if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1)); + if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2)); + } +#endif } |