diff options
author | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
commit | cead25f928ac606fc1a13882b818913aab3635a9 (patch) | |
tree | 92121b401f76f4b2891ebac0f710b0a921ce13b1 /src/lib_string.c | |
parent | c031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff) | |
download | luajit2-cead25f928ac606fc1a13882b818913aab3635a9.tar.gz |
DUALNUM: Handle integer type in x86/x64 interpreter and libraries.
Diffstat (limited to 'src/lib_string.c')
-rw-r--r-- | src/lib_string.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/lib_string.c b/src/lib_string.c index 61f73060..e2396abb 100644 --- a/src/lib_string.c +++ b/src/lib_string.c @@ -702,6 +702,38 @@ static void addintlen(char *form) form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; } +static unsigned LUA_INTFRM_T num2intfrm(lua_State *L, int arg) +{ + if (sizeof(LUA_INTFRM_T) == 4) { + return (LUA_INTFRM_T)lj_lib_checkbit(L, arg); + } else { + cTValue *o; + lj_lib_checknumber(L, arg); + o = L->base+arg-1; + if (tvisint(o)) + return (LUA_INTFRM_T)intV(o); + else + return (LUA_INTFRM_T)numV(o); + } +} + +static unsigned LUA_INTFRM_T num2uintfrm(lua_State *L, int arg) +{ + if (sizeof(LUA_INTFRM_T) == 4) { + return (unsigned LUA_INTFRM_T)lj_lib_checkbit(L, arg); + } else { + cTValue *o; + lj_lib_checknumber(L, arg); + o = L->base+arg-1; + if (tvisint(o)) + return (unsigned LUA_INTFRM_T)intV(o); + else if ((int32_t)o->u32.hi < 0) + return (unsigned LUA_INTFRM_T)(LUA_INTFRM_T)numV(o); + else + return (unsigned LUA_INTFRM_T)numV(o); + } +} + LJLIB_CF(string_format) { int arg = 1; @@ -726,11 +758,11 @@ LJLIB_CF(string_format) break; case 'd': case 'i': addintlen(form); - sprintf(buff, form, (LUA_INTFRM_T)lj_lib_checknum(L, arg)); + sprintf(buff, form, num2intfrm(L, arg)); break; case 'o': case 'u': case 'x': case 'X': addintlen(form); - sprintf(buff, form, (unsigned LUA_INTFRM_T)lj_lib_checknum(L, arg)); + sprintf(buff, form, num2uintfrm(L, arg)); break; case 'e': case 'E': case 'f': case 'g': case 'G': { TValue tv; |