Skip to content

Commit 400a29e

Browse files
Fix memory leak by not duplicating the YGConfig
Reviewed By: emilsjolander Differential Revision: D6945022 fbshipit-source-id: 5fd3c3e2ac1cd94d459d5aa06e0daa8f107779ac
1 parent 1a1a956 commit 400a29e

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

ReactCommon/yoga/yoga/Yoga-internal.h

+3-8
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,12 @@ struct YGCachedMeasurement {
6868
if (!std::isnan(computedWidth) || !std::isnan(measurement.computedWidth)) {
6969
isEqual = isEqual && computedWidth == measurement.computedWidth;
7070
}
71-
if (!std::isnan(
72-
computedHeight || !std::isnan(measurement.computedHeight))) {
71+
if (!std::isnan(computedHeight) ||
72+
!std::isnan(measurement.computedHeight)) {
7373
isEqual = isEqual && computedHeight == measurement.computedHeight;
7474
}
7575

76-
return availableWidth == measurement.availableWidth &&
77-
availableHeight == measurement.availableHeight &&
78-
widthMeasureMode == measurement.widthMeasureMode &&
79-
heightMeasureMode == measurement.heightMeasureMode &&
80-
computedWidth == measurement.computedWidth &&
81-
computedHeight == measurement.computedHeight;
76+
return isEqual;
8277
}
8378
};
8479

ReactCommon/yoga/yoga/Yoga.cpp

+26-4
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,16 @@ YGNodeRef YGNodeClone(YGNodeRef oldNode) {
251251
return node;
252252
}
253253

254+
static YGConfigRef YGConfigClone(const YGConfig& oldConfig) {
255+
const YGConfigRef config = new YGConfig(oldConfig);
256+
YGAssert(config != nullptr, "Could not allocate memory for config");
257+
if (config == nullptr) {
258+
abort();
259+
}
260+
gConfigInstanceCount++;
261+
return config;
262+
}
263+
254264
static YGNodeRef YGNodeDeepClone(YGNodeRef oldNode) {
255265
YGNodeRef node = YGNodeClone(oldNode);
256266
YGVector vec = YGVector();
@@ -263,12 +273,12 @@ static YGNodeRef YGNodeDeepClone(YGNodeRef oldNode) {
263273
}
264274
node->setChildren(vec);
265275

266-
if (oldNode->getNextChild() != nullptr) {
267-
node->setNextChild(YGNodeDeepClone(oldNode->getNextChild()));
276+
if (oldNode->getConfig() != nullptr) {
277+
node->setConfig(YGConfigClone(*(oldNode->getConfig())));
268278
}
269279

270-
if (node->getConfig() != nullptr) {
271-
node->setConfig(new YGConfig(*node->getConfig()));
280+
if (oldNode->getNextChild() != nullptr) {
281+
node->setNextChild(YGNodeDeepClone(oldNode->getNextChild()));
272282
}
273283

274284
return node;
@@ -291,6 +301,17 @@ void YGNodeFree(const YGNodeRef node) {
291301
gNodeInstanceCount--;
292302
}
293303

304+
static void YGConfigFreeRecursive(const YGNodeRef root) {
305+
if (root->getConfig() != nullptr) {
306+
gConfigInstanceCount--;
307+
delete root->getConfig();
308+
}
309+
// Delete configs recursively for childrens
310+
for (uint32_t i = 0; i < root->getChildrenCount(); ++i) {
311+
YGConfigFreeRecursive(root->getChild(i));
312+
}
313+
}
314+
294315
void YGNodeFreeRecursive(const YGNodeRef root) {
295316
while (YGNodeGetChildCount(root) > 0) {
296317
const YGNodeRef child = YGNodeGetChild(root, 0);
@@ -3642,6 +3663,7 @@ void YGNodeCalculateLayout(const YGNodeRef node,
36423663
YGPrintOptionsStyle));
36433664
}
36443665
}
3666+
YGConfigFreeRecursive(originalNode);
36453667
YGNodeFreeRecursive(originalNode);
36463668
}
36473669
}

0 commit comments

Comments
 (0)