summaryrefslogtreecommitdiff
path: root/src/lib_base.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/lib_base.c
parentc031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff)
downloadluajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.gz
luajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.bz2
luajit-cead25f928ac606fc1a13882b818913aab3635a9.zip
DUALNUM: Handle integer type in x86/x64 interpreter and libraries.
Diffstat (limited to 'src/lib_base.c')
-rw-r--r--src/lib_base.c14
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)
294LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) 306LJLIB_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