diff options
Diffstat (limited to 'src/lib_base.c')
-rw-r--r-- | src/lib_base.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/lib_base.c b/src/lib_base.c index 2672a076..fd7279af 100644 --- a/src/lib_base.c +++ b/src/lib_base.c | |||
@@ -197,6 +197,18 @@ LJLIB_ASM(tonumber) LJLIB_REC(.) | |||
197 | #if LJ_HASFFI | 197 | #if LJ_HASFFI |
198 | if (tviscdata(o)) { | 198 | if (tviscdata(o)) { |
199 | CTState *cts = ctype_cts(L); | 199 | CTState *cts = ctype_cts(L); |
200 | if (LJ_DUALNUM) { | ||
201 | CType *ct = ctype_raw(cts, cdataV(o)->typeid); | ||
202 | if (ctype_isinteger_or_bool(ct->info)) { | ||
203 | int64_t i; | ||
204 | lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT64), (uint8_t *)&i, o, 0); | ||
205 | if ((ct->size == 8 && (ct->info & CTF_UNSIGNED)) ? | ||
206 | (uint64_t)i <= 0x7fffffffu : checki32(i)) { | ||
207 | setintV(L->base-1, (int32_t)i); | ||
208 | return FFH_RES(1); | ||
209 | } /* else: retry and convert to double. */ | ||
210 | } | ||
211 | } | ||
200 | lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), | 212 | lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), |
201 | (uint8_t *)&(L->base-1)->n, o, 0); | 213 | (uint8_t *)&(L->base-1)->n, o, 0); |
202 | return FFH_RES(1); | 214 | return FFH_RES(1); |
@@ -294,7 +306,7 @@ LJLIB_ASM(pairs) | |||
294 | LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) | 306 | LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) |
295 | { | 307 | { |
296 | lj_lib_checktab(L, 1); | 308 | lj_lib_checktab(L, 1); |
297 | lj_lib_checknum(L, 2); | 309 | lj_lib_checkint(L, 2); |
298 | return FFH_UNREACHABLE; | 310 | return FFH_UNREACHABLE; |
299 | } | 311 | } |
300 | 312 | ||