aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-11-10 17:31:29 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-11-10 17:31:29 -0800
commit0f6bc429372bf571e1b52a11dfedcd84ceba99cc (patch)
treeafb8d8db79fa4ded0d5d4e8944cf6078ad765d90 /src
parentfa1544b5cacf6720c25222e7f94bb102670f1837 (diff)
fix for test_parseInt
Diffstat (limited to 'src')
-rw-r--r--src/library.js22
-rw-r--r--src/parseTools.js7
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);