diff options
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/library.js b/src/library.js index 624e8550..2158e803 100644 --- a/src/library.js +++ b/src/library.js @@ -2209,7 +2209,7 @@ LibraryManager.library = { } else if (type == 'i64') { ret = [{{{ makeGetValue('varargs', 'argIndex', 'i32', undefined, undefined, true) }}}, {{{ makeGetValue('varargs', 'argIndex+4', 'i32', undefined, undefined, true) }}}]; - ret = unSign(ret[0], 32) + unSign(ret[1], 32)*Math.pow(2, 32); // XXX - loss of precision + ret = unSign(ret[0], 32) + unSign(ret[1], 32)*Math.pow(2, 32); // Unsigned in this notation. Signed later if needed. // XXX - loss of precision #endif } else { ret = {{{ makeGetValue('varargs', 'argIndex', 'i32', undefined, undefined, true) }}}; @@ -3274,7 +3274,7 @@ LibraryManager.library = { }, _parseInt__deps: ['isspace', '__setErrNo', '$ERRNO_CODES'], - _parseInt: function(str, endptr, base, min, max, unsignBits) { + _parseInt: function(str, endptr, base, min, max, bits, unsign) { // Skip space. while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++; @@ -3325,12 +3325,12 @@ LibraryManager.library = { } // Unsign if needed. - if (unsignBits) { + if (unsign) { if (Math.abs(ret) > max) { ret = max; ___setErrNo(ERRNO_CODES.ERANGE); } else { - ret = unSign(ret, unsignBits); + ret = unSign(ret, bits); } } @@ -3340,23 +3340,29 @@ LibraryManager.library = { ___setErrNo(ERRNO_CODES.ERANGE); } +#if I64_MODE == 1 + if (bits == 64) { + ret = {{{ splitI64('ret') }}}; + } +#endif + return ret; }, strtoll__deps: ['_parseInt'], strtoll: function(str, endptr, base) { - return __parseInt(str, endptr, base, -9223372036854775808, 9223372036854775807); // LLONG_MIN, LLONG_MAX; imprecise. + return __parseInt(str, endptr, base, -9223372036854775808, 9223372036854775807, 64); // LLONG_MIN, LLONG_MAX; imprecise. }, strtol__deps: ['_parseInt'], strtol: function(str, endptr, base) { - return __parseInt(str, endptr, base, -2147483648, 2147483647); // LONG_MIN, LONG_MAX. + return __parseInt(str, endptr, base, -2147483648, 2147483647, 32); // LONG_MIN, LONG_MAX. }, strtoul__deps: ['_parseInt'], strtoul: function(str, endptr, base) { - return __parseInt(str, endptr, base, 0, 4294967295, 32); // ULONG_MAX. + return __parseInt(str, endptr, base, 0, 4294967295, 32, true); // ULONG_MAX. }, strtoull__deps: ['_parseInt'], strtoull: function(str, endptr, base) { - return __parseInt(str, endptr, base, 0, 18446744073709551615, 64); // ULONG_MAX; imprecise. + return __parseInt(str, endptr, base, 0, 18446744073709551615, 64, true); // ULONG_MAX; imprecise. }, qsort__deps: ['memcpy'], |