Fix bug where hex numbers would lose the minus sign.
diff --git a/double-conversion/double-conversion.cc b/double-conversion/double-conversion.cc
index feabe1f..7c8e9c6 100644
--- a/double-conversion/double-conversion.cc
+++ b/double-conversion/double-conversion.cc
@@ -661,7 +661,8 @@
}
ASSERT(number != 0);
- return Double(DiyFp(number, exponent)).value();
+ double result = Double(DiyFp(number, exponent)).value();
+ return sign ? -result : result;
}
template <class Iterator>
diff --git a/test/cctest/test-conversions.cc b/test/cctest/test-conversions.cc
index aa8ae39..d70624d 100644
--- a/test/cctest/test-conversions.cc
+++ b/test/cctest/test-conversions.cc
@@ -2526,6 +2526,43 @@
CHECK_EQ(Double::NaN(), StrToD("x3", flags, 0.0,
&processed, &all_used));
CHECK_EQ(0, processed);
+
+ CHECK_EQ(-5.634002666912405e+27, StrToD("-0x123456789012345678901234",
+ flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(72057594037927940.0, StrToD("0x100000000000001", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(72057594037927940.0, StrToD("0x100000000000000", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000000001", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000000000", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352900000.0, StrToD("0x100000000000008001", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000008000", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352960000.0, StrToD("0x100000000000018001", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
+
+ CHECK_EQ(295147905179352960000.0, StrToD("0x100000000000018000", flags, 0.0,
+ &processed, &all_used));
+ CHECK(all_used);
}