mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
97a4598bab
Summary: This diff adds more enforcement for consistency of `ShadowNodeMutation`s, including: * `Props` object for newly created or updated view must not be nullptr; * `oldShadowView` must describe the previous state of the view for `Update` instruction; * `ignoreDuplicateCreates` option was removed. I suspect some of the crashes we see in Fabric are caused by a violation of one of these constraints. If one of these fails in debug builds, we will get an early signal. Changelog: [Internal] Reviewed By: JoshuaGross Differential Revision: D24880821 fbshipit-source-id: 8c8a3d8e205ce34f6e0335e8a2b0cf676930c284
63 lines
2.0 KiB
C++
63 lines
2.0 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include "stubs.h"
|
|
|
|
#include <react/renderer/core/LayoutableShadowNode.h>
|
|
#include <react/renderer/core/ShadowNodeFragment.h>
|
|
#include <react/renderer/mounting/Differentiator.h>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
/*
|
|
* Generates `create` and `insert` instructions recursively traversing a shadow
|
|
* tree.
|
|
* This is a trivial implementation of diffing algorithm that can only "diff"
|
|
* an empty tree with some other one.
|
|
*/
|
|
static void calculateShadowViewMutationsForNewTree(
|
|
ShadowViewMutation::List &mutations,
|
|
ShadowView const &parentShadowView,
|
|
ShadowViewNodePair::List const &newChildPairs) {
|
|
for (auto index = 0; index < newChildPairs.size(); index++) {
|
|
auto const &newChildPair = newChildPairs[index];
|
|
|
|
mutations.push_back(
|
|
ShadowViewMutation::CreateMutation(newChildPair.shadowView));
|
|
mutations.push_back(ShadowViewMutation::InsertMutation(
|
|
parentShadowView, newChildPair.shadowView, index));
|
|
|
|
auto const newGrandChildPairs =
|
|
sliceChildShadowNodeViewPairs(*newChildPair.shadowNode);
|
|
|
|
calculateShadowViewMutationsForNewTree(
|
|
mutations, newChildPair.shadowView, newGrandChildPairs);
|
|
}
|
|
}
|
|
|
|
StubViewTree stubViewTreeFromShadowNode(ShadowNode const &rootShadowNode) {
|
|
auto mutations = ShadowViewMutation::List{};
|
|
mutations.reserve(256);
|
|
|
|
calculateShadowViewMutationsForNewTree(
|
|
mutations,
|
|
ShadowView(rootShadowNode),
|
|
sliceChildShadowNodeViewPairs(rootShadowNode));
|
|
|
|
auto emptyRootShadowNode = rootShadowNode.clone(
|
|
ShadowNodeFragment{ShadowNodeFragment::propsPlaceholder(),
|
|
ShadowNode::emptySharedShadowNodeSharedList()});
|
|
|
|
auto stubViewTree = StubViewTree(ShadowView(*emptyRootShadowNode));
|
|
stubViewTree.mutate(mutations);
|
|
return stubViewTree;
|
|
}
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|