From 1648e050cade0e0803714a488ab0c8817d9eaf5c Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 17 Feb 2021 10:19:54 -0500 Subject: [PATCH] torque: workaround stod() limitations on Solaris std::stod() on Solaris does not currently handle hex strings. This commit provides a workaround based on strtol() until proper stod() support is available. This was encountered while updating Node.js to V8 8.8. For more details see the following comment: https://github.com/nodejs/node/pull/36139#issuecomment-740131942 Change-Id: I16ed80a817f6d9105e7153b10824b1fee8520432 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2692746 Reviewed-by: Michael Stanton Commit-Queue: Michael Stanton Cr-Commit-Position: refs/heads/master@{#73255} --- src/torque/torque-parser.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/torque/torque-parser.cc b/src/torque/torque-parser.cc index 9008ed49b024..cab0182677aa 100644 --- a/src/torque/torque-parser.cc +++ b/src/torque/torque-parser.cc @@ -1834,7 +1834,18 @@ base::Optional MakeNumberLiteralExpression( // Meanwhile, we type it as constexpr float64 when out of int32 range. double value = 0; try { +#if defined(V8_OS_SOLARIS) + // stod() on Solaris does not currently support hex strings. Use strtol() + // specifically for hex literals until stod() support is available. + if (number.find("0x") == std::string::npos && + number.find("0X") == std::string::npos) { + value = std::stod(number); + } else { + value = static_cast(strtol(number.c_str(), nullptr, 0)); + } +#else value = std::stod(number); +#endif // !defined(V8_OS_SOLARIS) } catch (const std::out_of_range&) { Error("double literal out-of-range").Throw(); }