summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/public/Conversions.h1
-rw-r--r--js/public/Utility.h3
-rw-r--r--js/src/jsmath.cpp13
3 files changed, 9 insertions, 8 deletions
diff --git a/js/public/Conversions.h b/js/public/Conversions.h
index 1850a42f0e..200fc030fb 100644
--- a/js/public/Conversions.h
+++ b/js/public/Conversions.h
@@ -11,6 +11,7 @@
#include "mozilla/Casting.h"
#include "mozilla/FloatingPoint.h"
#include "mozilla/TypeTraits.h"
+#include "mozilla/WrappingOperations.h"
#include <math.h>
diff --git a/js/public/Utility.h b/js/public/Utility.h
index cadcef7000..dbe69e18c0 100644
--- a/js/public/Utility.h
+++ b/js/public/Utility.h
@@ -14,6 +14,7 @@
#include "mozilla/Scoped.h"
#include "mozilla/TemplateLib.h"
#include "mozilla/UniquePtr.h"
+#include "mozilla/WrappingOperations.h"
#include <stdlib.h>
#include <string.h>
@@ -539,7 +540,7 @@ ScrambleHashCode(HashNumber h)
* are stored in a hash table; see Knuth for details.
*/
static const HashNumber goldenRatio = 0x9E3779B9U;
- return h * goldenRatio;
+ return mozilla::WrappingMultiply(h, goldenRatio);
}
} /* namespace detail */
diff --git a/js/src/jsmath.cpp b/js/src/jsmath.cpp
index 75ab8fcb29..b98dba57cd 100644
--- a/js/src/jsmath.cpp
+++ b/js/src/jsmath.cpp
@@ -13,6 +13,7 @@
#include "mozilla/MathAlgorithms.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Unused.h"
+#include "mozilla/WrappingOperations.h"
#include <algorithm> // for std::max
#include <fcntl.h>
@@ -103,6 +104,7 @@ using mozilla::IsNegative;
using mozilla::IsNegativeZero;
using mozilla::PositiveInfinity;
using mozilla::NegativeInfinity;
+using mozilla::WrappingMultiply;
using JS::ToNumber;
using JS::GenericNaN;
@@ -458,16 +460,13 @@ js::math_floor(JSContext* cx, unsigned argc, Value* vp)
bool
js::math_imul_handle(JSContext* cx, HandleValue lhs, HandleValue rhs, MutableHandleValue res)
{
- uint32_t a = 0, b = 0;
- if (!lhs.isUndefined() && !ToUint32(cx, lhs, &a))
+ int32_t a = 0, b = 0;
+ if (!lhs.isUndefined() && !ToInt32(cx, lhs, &a))
return false;
- if (!rhs.isUndefined() && !ToUint32(cx, rhs, &b))
+ if (!rhs.isUndefined() && !ToInt32(cx, rhs, &b))
return false;
- uint32_t product = a * b;
- res.setInt32(product > INT32_MAX
- ? int32_t(INT32_MIN + (product - INT32_MAX - 1))
- : int32_t(product));
+ res.setInt32(WrappingMultiply(a, b));
return true;
}