From 6525f9b0828ec2c355ce5ebb54f7557f62b082c3 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Thu, 14 Oct 2021 19:21:44 -0700 Subject: [PATCH] Stop using RTTI features in Fabric core and components Summary: These dynamic_casts aren't really giving us much (they have never fired once in dev! and don't run in prod anyway). They also prevent us from disabling RTTI. So, let's get rid of them. Changelog: [Internal] Reviewed By: philIip Differential Revision: D31634895 fbshipit-source-id: 4a9b259837127feb324f64fa3e9e23eb1cc481a6 --- .../java/com/facebook/react/fabric/jni/BUCK | 2 ++ .../com/facebook/react/fabric/jni/Binding.cpp | 19 +++++++++++-------- ReactAndroid/src/main/jni/react/jni/BUCK | 2 ++ .../image/ImageComponentDescriptor.h | 2 -- .../InputAccessoryComponentDescriptor.h | 4 ---- .../modal/ModalHostViewComponentDescriptor.h | 5 ----- .../AndroidProgressBarComponentDescriptor.h | 3 --- .../slider/SliderComponentDescriptor.h | 3 --- .../AndroidSwitchComponentDescriptor.h | 3 --- .../text/ParagraphComponentDescriptor.h | 3 --- .../AndroidTextInputComponentDescriptor.h | 3 --- .../TextInputComponentDescriptor.h | 3 --- .../UnimplementedViewComponentDescriptor.cpp | 4 ---- ReactCommon/react/renderer/core/BUCK | 2 ++ .../core/ConcreteComponentDescriptor.h | 3 --- .../react/renderer/core/ConcreteShadowNode.h | 10 ---------- 16 files changed, 17 insertions(+), 54 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK index c4297f303ae..7ea630148b4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK @@ -11,6 +11,8 @@ rn_xplat_cxx_library( ], prefix = "react/fabric", ), + compiler_flags_enable_exceptions = True, + compiler_flags_enable_rtti = True, # dynamic_cast used within Binding.cpp fbandroid_allow_jni_merging = True, labels = ["supermodule:xplat/default/public.react_native.infra"], platforms = ANDROID, diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index b4d0abd9923..79b6c1ccf3a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -646,16 +646,19 @@ inline local_ref castReadableArray( // TODO: this method will be removed when binding for components are code-gen local_ref getPlatformComponentName(const ShadowView &shadowView) { - local_ref componentName; - auto newViewProps = - std::dynamic_pointer_cast(shadowView.props); + static std::string scrollViewComponentName = std::string("ScrollView"); - if (newViewProps && - newViewProps->getProbablyMoreHorizontalThanVertical_DEPRECATED()) { - componentName = make_jstring("AndroidHorizontalScrollView"); - } else { - componentName = make_jstring(shadowView.componentName); + local_ref componentName; + if (scrollViewComponentName.compare(shadowView.componentName) == 0) { + auto newViewProps = + std::static_pointer_cast(shadowView.props); + if (newViewProps->getProbablyMoreHorizontalThanVertical_DEPRECATED()) { + componentName = make_jstring("AndroidHorizontalScrollView"); + return componentName; + } } + + componentName = make_jstring(shadowView.componentName); return componentName; } diff --git a/ReactAndroid/src/main/jni/react/jni/BUCK b/ReactAndroid/src/main/jni/react/jni/BUCK index 39514497ecd..c2a91196bb2 100644 --- a/ReactAndroid/src/main/jni/react/jni/BUCK +++ b/ReactAndroid/src/main/jni/react/jni/BUCK @@ -38,6 +38,8 @@ rn_xplat_cxx_library( "-Wno-pessimizing-move", "-Wno-inconsistent-missing-override", ], + compiler_flags_enable_exceptions = True, + compiler_flags_enable_rtti = True, # dynamic_cast used within ReadableNative* fbandroid_allow_jni_merging = True, labels = ["supermodule:xplat/default/public.react_native.infra"], platforms = ANDROID, diff --git a/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h b/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h index 4366a886c4a..39465a0fe61 100644 --- a/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include #include @@ -29,7 +28,6 @@ class ImageComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert(std::dynamic_pointer_cast(shadowNode)); auto imageShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h b/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h index cf864d30f05..7978f06330a 100644 --- a/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h @@ -23,13 +23,9 @@ class InputAccessoryComponentDescriptor final using ConcreteComponentDescriptor::ConcreteComponentDescriptor; void adopt(ShadowNode::Unshared const &shadowNode) const override { - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto concreteShadowNode = std::static_pointer_cast(shadowNode); - react_native_assert(std::dynamic_pointer_cast( - concreteShadowNode)); auto layoutableShadowNode = std::static_pointer_cast(concreteShadowNode); diff --git a/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h b/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h index 4b5adb9c58e..c1130183ad1 100644 --- a/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h @@ -8,7 +8,6 @@ #pragma once #include -#include #include #include @@ -25,13 +24,9 @@ class ModalHostViewComponentDescriptor final using ConcreteComponentDescriptor::ConcreteComponentDescriptor; void adopt(ShadowNode::Unshared const &shadowNode) const override { - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto modalShadowNode = std::static_pointer_cast(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(modalShadowNode)); auto layoutableShadowNode = std::static_pointer_cast(modalShadowNode); diff --git a/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h b/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h index 8512b2ac917..9e012b91cc5 100644 --- a/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include "AndroidProgressBarMeasurementsManager.h" #include "AndroidProgressBarShadowNode.h" @@ -31,8 +30,6 @@ class AndroidProgressBarComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto androidProgressBarShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/slider/SliderComponentDescriptor.h b/ReactCommon/react/renderer/components/slider/SliderComponentDescriptor.h index a41089650b8..c167f68fa48 100644 --- a/ReactCommon/react/renderer/components/slider/SliderComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/slider/SliderComponentDescriptor.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include #include @@ -32,8 +31,6 @@ class SliderComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto sliderShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h b/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h index 754ec410eb8..b253baf1718 100644 --- a/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h @@ -10,7 +10,6 @@ #include "AndroidSwitchMeasurementsManager.h" #include "AndroidSwitchShadowNode.h" -#include #include namespace facebook { @@ -31,8 +30,6 @@ class AndroidSwitchComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto androidSwitchShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h b/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h index 42f6f386b63..0801a07b8d1 100644 --- a/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include #include @@ -33,8 +32,6 @@ class ParagraphComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto paragraphShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h b/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h index 8f0591e772d..1728de336a8 100644 --- a/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h @@ -15,7 +15,6 @@ #include #include -#include #include namespace facebook { @@ -88,8 +87,6 @@ class AndroidTextInputComponentDescriptor final protected: void adopt(ShadowNode::Unshared const &shadowNode) const override { - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto textInputShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputComponentDescriptor.h b/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputComponentDescriptor.h index ef36380552a..a23ad76a7b3 100644 --- a/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputComponentDescriptor.h +++ b/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputComponentDescriptor.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include @@ -30,8 +29,6 @@ class TextInputComponentDescriptor final void adopt(ShadowNode::Unshared const &shadowNode) const override { ConcreteComponentDescriptor::adopt(shadowNode); - react_native_assert( - std::dynamic_pointer_cast(shadowNode)); auto concreteShadowNode = std::static_pointer_cast(shadowNode); diff --git a/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp b/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp index 375a95c5d94..c6b46064167 100644 --- a/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp +++ b/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp @@ -7,8 +7,6 @@ #include "UnimplementedViewComponentDescriptor.h" -#include - namespace facebook { namespace react { @@ -28,8 +26,6 @@ Props::Shared UnimplementedViewComponentDescriptor::cloneProps( auto clonedProps = ConcreteComponentDescriptor::cloneProps( context, props, rawProps); - react_native_assert( - std::dynamic_pointer_cast(clonedProps)); // We have to clone `Props` object one more time to make sure that we have // an unshared (and non-`const`) copy of it which we can mutate. diff --git a/ReactCommon/react/renderer/core/BUCK b/ReactCommon/react/renderer/core/BUCK index f10420823e3..feb8f6569be 100644 --- a/ReactCommon/react/renderer/core/BUCK +++ b/ReactCommon/react/renderer/core/BUCK @@ -32,6 +32,8 @@ rn_xplat_cxx_library( ], prefix = "react/renderer/core", ), + compiler_flags_enable_exceptions = True, + compiler_flags_enable_rtti = True, # Needed for DebugStringConvertible - need to find a non-RTTI way to do this / enable RTTI for debug builds only fbobjc_compiler_flags = APPLE_COMPILER_FLAGS, fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(), force_static = True, diff --git a/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index 71630941032..08193e7609f 100644 --- a/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -66,9 +66,6 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { ShadowNode::Shared createShadowNode( const ShadowNodeFragment &fragment, ShadowNodeFamily::Shared const &family) const override { - react_native_assert( - std::dynamic_pointer_cast(fragment.props)); - auto shadowNode = std::make_shared(fragment, family, getTraits()); diff --git a/ReactCommon/react/renderer/core/ConcreteShadowNode.h b/ReactCommon/react/renderer/core/ConcreteShadowNode.h index 8ad8820f59e..537aa6dcbf2 100644 --- a/ReactCommon/react/renderer/core/ConcreteShadowNode.h +++ b/ReactCommon/react/renderer/core/ConcreteShadowNode.h @@ -99,9 +99,6 @@ class ConcreteShadowNode : public BaseShadowNodeT { ConcreteProps const &getConcreteProps() const { react_native_assert( BaseShadowNodeT::props_ && "Props must not be `nullptr`."); - react_native_assert( - std::dynamic_pointer_cast(props_) && - "Props must be an instance of ConcreteProps class."); return static_cast(*props_); } @@ -110,10 +107,6 @@ class ConcreteShadowNode : public BaseShadowNodeT { * Thread-safe after the node is sealed. */ ConcreteEventEmitter const &getConcreteEventEmitter() const { - react_native_assert( - std::dynamic_pointer_cast( - BaseShadowNodeT::getEventEmitter()) && - "EventEmitter must be an instance of ConcreteEventEmitter class."); return static_cast( *BaseShadowNodeT::getEventEmitter()); } @@ -124,9 +117,6 @@ class ConcreteShadowNode : public BaseShadowNodeT { */ ConcreteStateData const &getStateData() const { react_native_assert(state_ && "State must not be `nullptr`."); - react_native_assert( - std::dynamic_pointer_cast(state_) && - "State must be an instance of ConcreteState class."); return static_cast(state_.get())->getData(); }