Sanitize measure function results
Summary: X-link: https://github.com/facebook/react-native/pull/44557 We've started seeing assertion failures in Yoga where a `NaN` value makes its way to an `availableHeight` constraint when measuring Litho tree. Because it's only happening on Litho, I have some suspicion this might be originating from a Litho-specific measure function. This adds sanitization in Yoga to measure function results, where we will log an error, and set size to zero, if either dimension ends up being negative of `NaN`. This doesn't really help track down where the error was happening, but Yoga doesn't have great context to show this to begin with. If we see this is issue, next steps would be Litho internal intrumentation to find culprit. Changelog: [Internal] Reviewed By: joevilches Differential Revision: D57285584 fbshipit-source-id: 935fcdd28c05bbac0d73e1c7654ae11a74898537
This commit is contained in:
committed by
Facebook GitHub Bot
parent
dc23284cf7
commit
eb1ca8ec7a
@@ -10,6 +10,7 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <yoga/debug/AssertFatal.h>
|
||||
#include <yoga/debug/Log.h>
|
||||
#include <yoga/node/Node.h>
|
||||
#include <yoga/numeric/Comparison.h>
|
||||
|
||||
@@ -49,12 +50,29 @@ Node::Node(Node&& node) noexcept
|
||||
}
|
||||
|
||||
YGSize Node::measure(
|
||||
float width,
|
||||
float availableWidth,
|
||||
MeasureMode widthMode,
|
||||
float height,
|
||||
float availableHeight,
|
||||
MeasureMode heightMode) {
|
||||
return measureFunc_(
|
||||
this, width, unscopedEnum(widthMode), height, unscopedEnum(heightMode));
|
||||
const auto size = measureFunc_(
|
||||
this,
|
||||
availableWidth,
|
||||
unscopedEnum(widthMode),
|
||||
availableHeight,
|
||||
unscopedEnum(heightMode));
|
||||
|
||||
if (yoga::isUndefined(size.height) || size.height < 0 ||
|
||||
yoga::isUndefined(size.width) || size.width < 0) {
|
||||
yoga::log(
|
||||
this,
|
||||
LogLevel::Error,
|
||||
"Measure function returned an invalid dimension to Yoga: [width=%f, height=%f]",
|
||||
size.width,
|
||||
size.height);
|
||||
return {.width = 0.0f, .height = 0.0f};
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
float Node::baseline(float width, float height) const {
|
||||
|
Reference in New Issue
Block a user