diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-11-10 17:31:29 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-11-10 17:31:29 -0800 |
commit | 0f6bc429372bf571e1b52a11dfedcd84ceba99cc (patch) | |
tree | afb8d8db79fa4ded0d5d4e8944cf6078ad765d90 /src | |
parent | fa1544b5cacf6720c25222e7f94bb102670f1837 (diff) |
fix for test_parseInt
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 22 | ||||
-rw-r--r-- | src/parseTools.js | 7 |
2 files changed, 21 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'], diff --git a/src/parseTools.js b/src/parseTools.js index 67d87a76..fad414ed 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -533,12 +533,19 @@ function IEEEUnHex(stringy) { function makeI64(low, high) { if (I64_MODE == 1) { return '[' + low + ',' + (high || '0') + ']'; + // FIXME with this? return '[unSign(' + low + ',32),' + (high ? ('unSign(' + high + ',32)') : '0') + ']'; } else { assert(!high); return low; } } +// Splits a number (an integer in a double, possibly > 32 bits) into an I64_MODE 1 i64 value +function splitI64(value) { + assert(I64_MODE == 1); + return makeI64(value + '|0', 'Math.floor(' + value + '/4294967296)'); +} + function makeCopyI64(value) { assert(I64_MODE == 1); |