diff options
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) | |||
385 | } | 385 | } |
386 | 386 | ||
387 | /* Helper for FORI. Coercion. */ | 387 | /* Helper for FORI. Coercion. */ |
388 | void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *base) | 388 | void 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 | ||