diff --git a/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h b/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h index 11b82b32feb..f690cb652f7 100644 --- a/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h +++ b/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h @@ -41,7 +41,7 @@ public: const InstanceHandle &instanceHandle, const SharedProps &props ) const override { - return std::make_shared( + UnsharedShadowNode shadowNode = std::make_shared( tag, rootTag, instanceHandle, @@ -49,14 +49,19 @@ public: ShadowNode::emptySharedShadowNodeSharedList(), getCloneFunction() ); + adopt(shadowNode); + return shadowNode; } SharedShadowNode cloneShadowNode( - const SharedShadowNode &shadowNode, + const SharedShadowNode &sourceShadowNode, const SharedProps &props = nullptr, const SharedShadowNodeSharedList &children = nullptr ) const override { - return std::make_shared(std::static_pointer_cast(shadowNode), std::static_pointer_cast(props), children); + assert(std::dynamic_pointer_cast(sourceShadowNode)); + UnsharedShadowNode shadowNode = std::make_shared(std::static_pointer_cast(sourceShadowNode), std::static_pointer_cast(props), children); + adopt(shadowNode); + return shadowNode; } void appendChild( @@ -75,7 +80,14 @@ public: return ShadowNodeT::Props(rawProps, props); }; +protected: + + virtual void adopt(UnsharedShadowNode shadowNode) const { + // Default implementation does nothing. + } + private: + mutable ShadowNodeCloneFunction cloneFunction_; ShadowNodeCloneFunction getCloneFunction() const { diff --git a/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h b/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h index 9a18cf7e1ed..aca5fc32bea 100644 --- a/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h +++ b/ReactCommon/fabric/core/shadownode/ConcreteShadowNode.h @@ -36,6 +36,7 @@ public: } auto concreteBaseProps = std::dynamic_pointer_cast(baseProps); + assert(concreteBaseProps); auto props = std::make_shared(*concreteBaseProps); props->apply(rawProps); return props; @@ -79,6 +80,8 @@ public: } const SharedConcreteProps getProps() const { + assert(std::dynamic_pointer_cast(props_)); + return std::static_pointer_cast(props_); } diff --git a/ReactCommon/fabric/core/shadownode/ShadowNode.h b/ReactCommon/fabric/core/shadownode/ShadowNode.h index 9cad65eadfb..fec74d3ab9d 100644 --- a/ReactCommon/fabric/core/shadownode/ShadowNode.h +++ b/ReactCommon/fabric/core/shadownode/ShadowNode.h @@ -23,6 +23,7 @@ namespace react { class ShadowNode; using SharedShadowNode = std::shared_ptr; +using UnsharedShadowNode = std::shared_ptr; using SharedShadowNodeList = std::vector>; using SharedShadowNodeSharedList = std::shared_ptr; using SharedShadowNodeUnsharedList = std::shared_ptr;