From 9da43337911c2f3d1cc0bda02df258c260ca741d Mon Sep 17 00:00:00 2001 From: Tomek Zawadzki Date: Thu, 4 Jul 2024 16:47:00 +0200 Subject: [PATCH 1/4] Fix dynamic_cast (RTTI) by adding key function to ShadowNodeWrapper again --- .../ReactCommon/react/renderer/core/ShadowNode.cpp | 6 ++++++ .../ReactCommon/react/renderer/core/ShadowNode.h | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index 5b60ac98428..f6feb2834e4 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -410,4 +410,10 @@ SharedDebugStringConvertibleList ShadowNode::getDebugProps() const { } #endif +// Explicitly define destructors here, as they to exist in order to act as a +// "key function" for the ShadowNodeWrapper class -- this allows for RTTI to work +// properly across dynamic library boundaries (i.e. dynamic_cast that is used by +// getNativeState method) +ShadowNodeWrapper::~ShadowNodeWrapper() = default; + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h index e40321c2574..ea5dae23eeb 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h @@ -282,6 +282,11 @@ struct ShadowNodeWrapper : public jsi::NativeState { explicit ShadowNodeWrapper(ShadowNode::Shared shadowNode) : shadowNode(std::move(shadowNode)) {} + // The below method needs to be implemented out-of-line in order for the class + // to have at least one "key function" (see + // https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vague-vtable) + ~ShadowNodeWrapper() override; + ShadowNode::Shared shadowNode; }; From e5379162f82d8d94c57a7d7ed0a6d44fe290a4d2 Mon Sep 17 00:00:00 2001 From: Tomek Zawadzki Date: Thu, 4 Jul 2024 17:31:25 +0200 Subject: [PATCH 2/4] Update packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp Co-authored-by: Wojciech Lewicki --- .../react-native/ReactCommon/react/renderer/core/ShadowNode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index f6feb2834e4..b84d539ed1c 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -410,7 +410,7 @@ SharedDebugStringConvertibleList ShadowNode::getDebugProps() const { } #endif -// Explicitly define destructors here, as they to exist in order to act as a +// Explicitly define destructors here, as they have to exist in order to act as a // "key function" for the ShadowNodeWrapper class -- this allows for RTTI to work // properly across dynamic library boundaries (i.e. dynamic_cast that is used by // getNativeState method) From 74a356628320220112949a0fff9bcc7f5e079c76 Mon Sep 17 00:00:00 2001 From: Tomek Zawadzki Date: Thu, 4 Jul 2024 17:32:14 +0200 Subject: [PATCH 3/4] Fix more typos --- .../ReactCommon/react/renderer/uimanager/UIManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index 949f367117d..69584cb75a5 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -36,8 +36,8 @@ std::unique_ptr constructLeakCheckerIfNeeded( namespace facebook::react { -// Explicitly define destructors here, as they to exist in order to act as a -// "key function" for the ShadowNodeWrapper class -- this allow for RTTI to work +// Explicitly define destructors here, as they have to exist in order to act as a +// "key function" for the ShadowNodeWrapper class -- this allows for RTTI to work // properly across dynamic library boundaries (i.e. dynamic_cast that is used by // isHostObject method) ShadowNodeListWrapper::~ShadowNodeListWrapper() = default; From 6f65687e37f89ff3fb77276aef4ee3bd6ade63a6 Mon Sep 17 00:00:00 2001 From: Tomek Zawadzki Date: Thu, 4 Jul 2024 17:33:50 +0200 Subject: [PATCH 4/4] Update comment --- .../ReactCommon/react/renderer/uimanager/UIManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index 69584cb75a5..1453c3a3c5a 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -39,7 +39,7 @@ namespace facebook::react { // Explicitly define destructors here, as they have to exist in order to act as a // "key function" for the ShadowNodeWrapper class -- this allows for RTTI to work // properly across dynamic library boundaries (i.e. dynamic_cast that is used by -// isHostObject method) +// getNativeState method) ShadowNodeListWrapper::~ShadowNodeListWrapper() = default; UIManager::UIManager(