Index: src/utils.cc |
diff --git a/src/utils.cc b/src/utils.cc |
index 52b0d485eb994c72949f2ca0163fee136f9a5114..df1f280d787525f976c08778078dedd6b5dc5073 100644 |
--- a/src/utils.cc |
+++ b/src/utils.cc |
@@ -394,4 +394,24 @@ void init_memcopy_functions() { |
} |
+bool DoubleToBoolean(double d) { |
+ // NaN, +0, and -0 should return the false object |
+#if __BYTE_ORDER == __LITTLE_ENDIAN |
+ union IeeeDoubleLittleEndianArchType u; |
+#elif __BYTE_ORDER == __BIG_ENDIAN |
+ union IeeeDoubleBigEndianArchType u; |
+#endif |
+ u.d = d; |
+ if (u.bits.exp == 2047) { |
+ // Detect NaN for IEEE double precision floating point. |
+ if ((u.bits.man_low | u.bits.man_high) != 0) return false; |
+ } |
+ if (u.bits.exp == 0) { |
+ // Detect +0, and -0 for IEEE double precision floating point. |
+ if ((u.bits.man_low | u.bits.man_high) == 0) return false; |
+ } |
+ return true; |
+} |
+ |
+ |
} } // namespace v8::internal |