From 604a9a98a972ae11590e0de4e3e9faac385302fd Mon Sep 17 00:00:00 2001 From: Eduardo Roman Date: Wed, 16 Jan 2019 11:53:04 -0800 Subject: [PATCH] guard against INF values in CompactValue Summary: After this diff D13403925 that got rid of `-ffast-math` we started to have a very odd behavior on Yoga when using release builds. After digging a while we found that certain set of conditions on O2 and O3 optimization levels was causing Origami to set some `INFINITE` values on Yoga. We found the root of the problem and fix it on Origami side. But I'm wondering if guarding agains `INFINITE` on Yoga side would be good too. Since now Yoga it's not using `-ffast-math` anymore, and I think infinite is not a a valid value anywhere on Yoga side, it seems to support the reason to guard against it. I'm happy to abandon this diff if you guys think this is not a good solution. Reviewed By: davidaurelio Differential Revision: D13679319 fbshipit-source-id: 061448fea9d1a8496362ff07dc46b546e7f1ffa3 --- tests/CompactValueTest.cpp | 12 ++++++++++++ yoga/CompactValue.h | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/CompactValueTest.cpp b/tests/CompactValueTest.cpp index 7d2afc13..d0a2c669 100644 --- a/tests/CompactValueTest.cpp +++ b/tests/CompactValueTest.cpp @@ -29,6 +29,18 @@ TEST(YogaTest, compact_value_can_represent_undefined) { ASSERT_FALSE(c.isAuto()); } +TEST(YogaTest, compact_value_manages_infinity_as_undefined) { + auto c = CompactValue{ + YGValue{std::numeric_limits::infinity(), YGUnitUndefined}}; + YGValue v = c; + ASSERT_EQ(v, YGValueUndefined); + ASSERT_NE(v, YGValueAuto); + ASSERT_NE(v, (YGValue{-1.25, YGUnitPoint})); + ASSERT_NE(v, (YGValue{25, YGUnitPercent})); + ASSERT_TRUE(c.isUndefined()); + ASSERT_FALSE(c.isAuto()); +} + TEST(YogaTest, compact_value_can_represent_auto) { auto c = CompactValue{YGValue{0, YGUnitAuto}}; YGValue v = c; diff --git a/yoga/CompactValue.h b/yoga/CompactValue.h index 9c9a92e0..3cc36a48 100644 --- a/yoga/CompactValue.h +++ b/yoga/CompactValue.h @@ -70,7 +70,8 @@ public: template static CompactValue ofMaybe(float value) noexcept { - return std::isnan(value) ? ofUndefined() : of(value); + return std::isnan(value) || std::isinf(value) ? ofUndefined() + : of(value); } static constexpr CompactValue ofZero() noexcept {