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 | luajit-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.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) | |||
702 | form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; | 702 | form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; |
703 | } | 703 | } |
704 | 704 | ||
705 | static 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 | |||
720 | static 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 | |||
705 | LJLIB_CF(string_format) | 737 | LJLIB_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; |