Permalink
Browse files

Fix SingleFlex Child condition

Summary:
Fixes the improper `singleFlexChild` optimization. In the case when all the childs have `flex-grow:0 flex-grow:0` except one child with `flex-grow:1 flex-shrink:1`, then one can simply measure all the non-flexing children and then give the flexing child all the remaining space.

Also added a test case which reproduced the bug

Reviewed By: IanChilds

Differential Revision: D8782684

fbshipit-source-id: ffd4d35b6122f82111b987540efb23bd2a8da5a2
  • Loading branch information...
priteshrnandgaonkar authored and facebook-github-bot committed Jul 11, 2018
1 parent 578b0b2 commit 90a408ea6ff7833e33b4058f490073e04460d00b
Showing with 8 additions and 7 deletions.
  1. +8 −7 ReactCommon/yoga/yoga/Yoga.cpp
@@ -1788,16 +1788,17 @@ static void YGNodeComputeFlexBasisForChildren(
// child to exactly match the remaining space
if (measureModeMainDim == YGMeasureModeExactly) {
for (auto child : children) {
if (singleFlexChild != nullptr) {
if (child->isNodeFlexible()) {
// There is already a flexible child, abort
if (child->isNodeFlexible()) {
if (singleFlexChild != nullptr ||
YGFloatsEqual(child->resolveFlexGrow(), 0.0f) ||
YGFloatsEqual(child->resolveFlexShrink(), 0.0f)) {
// There is already a flexible child, or this flexible child doesn't
// have flexGrow and flexShrink, abort
singleFlexChild = nullptr;
break;
} else {
singleFlexChild = child;
}
} else if (
child->resolveFlexGrow() > 0.0f &&
child->resolveFlexShrink() > 0.0f) {
singleFlexChild = child;
}
}
}

0 comments on commit 90a408e

Please sign in to comment.