summaryrefslogtreecommitdiff
path: root/src/lj_meta.c
diff options
context:
space:
mode:
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)
385} 385}
386 386
387/* Helper for FORI. Coercion. */ 387/* Helper for FORI. Coercion. */
388void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *base) 388void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)
389{ 389{
390 if (!str2num(base, base)) lj_err_msg(L, LJ_ERR_FORINIT); 390 if (!(tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o))))
391 if (!str2num(base+1, base+1)) lj_err_msg(L, LJ_ERR_FORLIM); 391 lj_err_msg(L, LJ_ERR_FORINIT);
392 if (!str2num(base+2, base+2)) lj_err_msg(L, LJ_ERR_FORSTEP); 392 if (!(tvisnumber(o+1) || (tvisstr(o+1) && lj_str_tonumber(strV(o+1), o+1))))
393 lj_err_msg(L, LJ_ERR_FORLIM);
394 if (!(tvisnumber(o+2) || (tvisstr(o+2) && lj_str_tonumber(strV(o+2), o+2))))
395 lj_err_msg(L, LJ_ERR_FORSTEP);
396#if LJ_DUALNUM
397 /* Ensure all slots are integers or all slots are numbers. */
398 if (!(tvisint(o) && tvisint(o+1) && tvisint(o+2))) {
399 if (tvisint(o)) setnumV(o, (lua_Number)intV(o));
400 if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));
401 if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));
402 }
403#endif
393} 404}
394 405