From f80b349d5490aa289b2925d297f3f3c618977570 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 27 Nov 2025 17:45:17 +0100 Subject: Unify Lua number to FFI integer conversions. Phew. #1411 --- src/lj_parse.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src/lj_parse.c') diff --git a/src/lj_parse.c b/src/lj_parse.c index 181ce4d7..832f6bf4 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -522,9 +522,9 @@ static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg) ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv)); else #else - lua_Number n = expr_numberV(e); - int32_t k = lj_num2int(n); - if (checki16(k) && n == (lua_Number)k) + int64_t i64; + int32_t k; + if (lj_num2int_cond(expr_numberV(e), i64, k, checki16((int32_t)i64))) ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k); else #endif @@ -782,8 +782,9 @@ static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2) setnumV(&o, n); if (tvisnan(&o) || tvismzero(&o)) return 0; /* Avoid NaN and -0 as consts. */ if (LJ_DUALNUM) { - int32_t k = lj_num2int(n); - if ((lua_Number)k == n) { + int64_t i64; + int32_t k; + if (lj_num2int_check(n, i64, k)) { setintV(&e1->u.nval, k); return 1; } @@ -1386,10 +1387,10 @@ static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr) if (tvisnum(&n->key)) { TValue *tv = &((TValue *)kptr)[kidx]; if (LJ_DUALNUM) { - lua_Number nn = numV(&n->key); - int32_t k = lj_num2int(nn); + int64_t i64; + int32_t k; lj_assertFS(!tvismzero(&n->key), "unexpected -0 key"); - if ((lua_Number)k == nn) + if (lj_num2int_check(numV(&n->key), i64, k)) setintV(tv, k); else *tv = n->key; @@ -1656,9 +1657,9 @@ static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e) } } #else - lua_Number n = expr_numberV(e); - int32_t k = lj_num2int(n); - if (checku8(k) && n == (lua_Number)k) { + int64_t i64; + int32_t k; + if (lj_num2int_cond(expr_numberV(e), i64, k, checku8((int32_t)i64))) { t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */ return; } -- cgit v1.2.3-55-g6feb