summaryrefslogtreecommitdiff
path: root/src/lj_meta.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-27 01:36:59 +0100
committerMike Pall <mike>2011-02-27 01:36:59 +0100
commitcead25f928ac606fc1a13882b818913aab3635a9 (patch)
tree92121b401f76f4b2891ebac0f710b0a921ce13b1 /src/lj_meta.c
parentc031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff)
downloadluajit2-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.c19
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
}