From 12e5df844bf60c19a825e5c5738d765a8562945c Mon Sep 17 00:00:00 2001 From: Eric Rozell Date: Thu, 20 Mar 2025 04:57:36 -0700 Subject: [PATCH] Convert folly::dynamic event dispatch to r-value (#50133) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/50133 Allow move semantics for folly::dynamic event dispatching to avoid copying the folly::dynamic when dispatched. ## Changelog [General][Breaking] - Dispatch folly::dynamic events with r-value instead of l-value Reviewed By: NickGerleman Differential Revision: D71423497 fbshipit-source-id: 5435772e14b025aab97d34df9983b91fd7285fd0 --- ...CTLegacyViewManagerInteropComponentView.mm | 7 ++--- ...gacyViewManagerInteropCoordinatorAdapter.h | 2 +- ...acyViewManagerInteropCoordinatorAdapter.mm | 4 +-- .../LegacyViewManagerInteropShadowNode.h | 3 +- ...gacyViewManagerInteropViewEventEmitter.cpp | 18 ----------- ...LegacyViewManagerInteropViewEventEmitter.h | 31 ------------------- .../RCTLegacyViewManagerInteropCoordinator.h | 2 +- ...ableLegacyViewManagerAutomaticShadowNode.h | 1 - .../react/renderer/core/EventEmitter.cpp | 8 ++--- .../react/renderer/core/EventEmitter.h | 5 ++- 10 files changed, 14 insertions(+), 67 deletions(-) delete mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.cpp delete mode 100644 packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.h diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm index 72213b685c6..fdb6ad1ba7e 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm @@ -212,12 +212,11 @@ static NSString *const kRCTLegacyInteropChildIndexKey = @"index"; if (!_adapter) { _adapter = [[RCTLegacyViewManagerInteropCoordinatorAdapter alloc] initWithCoordinator:[self _coordinator] reactTag:self.tag]; - _adapter.eventInterceptor = ^(std::string eventName, folly::dynamic event) { + _adapter.eventInterceptor = ^(std::string eventName, folly::dynamic &&event) { if (weakSelf) { __typeof(self) strongSelf = weakSelf; - const auto &eventEmitter = - static_cast(*strongSelf->_eventEmitter); - eventEmitter.dispatchEvent(eventName, event); + const auto &eventEmitter = static_cast(*strongSelf->_eventEmitter); + eventEmitter.dispatchEvent(eventName, std::move(event)); } }; // Set props immediately. This is required to set the initial state of the view. diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.h b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.h index d62aaca3ff2..23549b1ab43 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.h +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.h @@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) UIView *paperView; -@property (nonatomic, copy, nullable) void (^eventInterceptor)(std::string eventName, folly::dynamic event); +@property (nonatomic, copy, nullable) void (^eventInterceptor)(std::string eventName, folly::dynamic &&event); - (void)setProps:(const folly::dynamic &)props; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm index 341de93e877..742a3713b71 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm @@ -36,9 +36,9 @@ _paperView = [_coordinator createPaperViewWithTag:_tag]; __weak __typeof(self) weakSelf = self; [_coordinator addObserveForTag:_tag - usingBlock:^(std::string eventName, folly::dynamic event) { + usingBlock:^(std::string eventName, folly::dynamic &&event) { if (weakSelf.eventInterceptor) { - weakSelf.eventInterceptor(eventName, event); + weakSelf.eventInterceptor(eventName, std::move(event)); } }]; } diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.h index c3d44690a10..0372688ae96 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.h @@ -8,7 +8,6 @@ #pragma once #include -#include #include #include @@ -19,7 +18,7 @@ extern const char LegacyViewManagerInteropComponentName[]; using LegacyViewManagerInteropShadowNode = ConcreteViewShadowNode< LegacyViewManagerInteropComponentName, LegacyViewManagerInteropViewProps, - LegacyViewManagerInteropViewEventEmitter, + ViewEventEmitter, LegacyViewManagerInteropState>; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.cpp deleted file mode 100644 index 1e5dd6ca366..00000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#include "LegacyViewManagerInteropViewEventEmitter.h" -#include - -namespace facebook::react { -void LegacyViewManagerInteropViewEventEmitter::dispatchEvent( - const std::string& type, - const folly::dynamic& payload) const { - EventEmitter::dispatchEvent(type, payload); -} - -} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.h deleted file mode 100644 index eff9ce45d22..00000000000 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewEventEmitter.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include - -#include -#include -#include - -namespace facebook::react { - -class LegacyViewManagerInteropViewEventEmitter; - -using SharedLegacyViewManagerInteropViewEventEmitter = - std::shared_ptr; - -class LegacyViewManagerInteropViewEventEmitter : public ViewEventEmitter { - public: - using ViewEventEmitter::ViewEventEmitter; - - void dispatchEvent(const std::string& type, const folly::dynamic& payload) - const; -}; - -} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h index e0b1a969de2..76279ecced5 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h @@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN @class RCTBridge; @class RCTBridgeProxy; -typedef void (^InterceptorBlock)(std::string eventName, folly::dynamic event); +typedef void (^InterceptorBlock)(std::string eventName, folly::dynamic &&event); @interface RCTLegacyViewManagerInteropCoordinator : NSObject diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h index fd0315155f8..59081e6b00f 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp index b4af39c6841..aecdd88be50 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp @@ -57,20 +57,20 @@ EventEmitter::EventEmitter( void EventEmitter::dispatchEvent( std::string type, - const folly::dynamic& payload, + folly::dynamic&& payload, RawEvent::Category category) const { dispatchEvent( std::move(type), - std::make_shared(folly::dynamic(payload)), + std::make_shared(std::move(payload)), category); } void EventEmitter::dispatchUniqueEvent( std::string type, - const folly::dynamic& payload) const { + folly::dynamic&& payload) const { dispatchUniqueEvent( std::move(type), - std::make_shared(folly::dynamic(payload))); + std::make_shared(std::move(payload))); } void EventEmitter::dispatchEvent( diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h index d2b4237526c..e5a2e092119 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h @@ -86,7 +86,7 @@ class EventEmitter { void dispatchEvent( std::string type, - const folly::dynamic& payload, + folly::dynamic&& payload, RawEvent::Category category = RawEvent::Category::Unspecified) const; void dispatchEvent( @@ -94,8 +94,7 @@ class EventEmitter { SharedEventPayload payload, RawEvent::Category category = RawEvent::Category::Unspecified) const; - void dispatchUniqueEvent(std::string type, const folly::dynamic& payload) - const; + void dispatchUniqueEvent(std::string type, folly::dynamic&& payload) const; void dispatchUniqueEvent( std::string type,