summaryrefslogtreecommitdiff
path: root/src/lib_string.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_string.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_string.c')
-rw-r--r--src/lib_string.c36
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)
702 form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; 702 form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0';
703} 703}
704 704
705static unsigned LUA_INTFRM_T num2intfrm(lua_State *L, int arg)
706{
707 if (sizeof(LUA_INTFRM_T) == 4) {
708 return (LUA_INTFRM_T)lj_lib_checkbit(L, arg);
709 } else {
710 cTValue *o;
711 lj_lib_checknumber(L, arg);
712 o = L->base+arg-1;
713 if (tvisint(o))
714 return (LUA_INTFRM_T)intV(o);
715 else
716 return (LUA_INTFRM_T)numV(o);
717 }
718}
719
720static unsigned LUA_INTFRM_T num2uintfrm(lua_State *L, int arg)
721{
722 if (sizeof(LUA_INTFRM_T) == 4) {
723 return (unsigned LUA_INTFRM_T)lj_lib_checkbit(L, arg);
724 } else {
725 cTValue *o;
726 lj_lib_checknumber(L, arg);
727 o = L->base+arg-1;
728 if (tvisint(o))
729 return (unsigned LUA_INTFRM_T)intV(o);
730 else if ((int32_t)o->u32.hi < 0)
731 return (unsigned LUA_INTFRM_T)(LUA_INTFRM_T)numV(o);
732 else
733 return (unsigned LUA_INTFRM_T)numV(o);
734 }
735}
736
705LJLIB_CF(string_format) 737LJLIB_CF(string_format)
706{ 738{
707 int arg = 1; 739 int arg = 1;
@@ -726,11 +758,11 @@ LJLIB_CF(string_format)
726 break; 758 break;
727 case 'd': case 'i': 759 case 'd': case 'i':
728 addintlen(form); 760 addintlen(form);
729 sprintf(buff, form, (LUA_INTFRM_T)lj_lib_checknum(L, arg)); 761 sprintf(buff, form, num2intfrm(L, arg));
730 break; 762 break;
731 case 'o': case 'u': case 'x': case 'X': 763 case 'o': case 'u': case 'x': case 'X':
732 addintlen(form); 764 addintlen(form);
733 sprintf(buff, form, (unsigned LUA_INTFRM_T)lj_lib_checknum(L, arg)); 765 sprintf(buff, form, num2uintfrm(L, arg));
734 break; 766 break;
735 case 'e': case 'E': case 'f': case 'g': case 'G': { 767 case 'e': case 'E': case 'f': case 'g': case 'G': {
736 TValue tv; 768 TValue tv;