From a142a784733bc7e37042a7e4d3cdbeff99aa1fa7 Mon Sep 17 00:00:00 2001 From: Ruslan Shestopalyuk Date: Tue, 2 Aug 2022 15:14:16 -0700 Subject: [PATCH] Fix regression when setting shadow node properties in D38272966 (github PR merge) Summary: Changelog: [Android][Fixed] - Fix regression when setting shadow node properties. Also simplified the corresponding macros to avoid using lambdas altogether, as they are not required. Note that this **does not** modify any constexpr-related semantics of the existing code, as the main constexpr macro, `CONSTEXPR_RAW_PROPS_KEY_HASH` evaluation result is still contstexpr value, and the other ones already involved non-const parts (see my comments). Reviewed By: NickGerleman Differential Revision: D38356411 fbshipit-source-id: 22c330d3425c8aed36693f4652f1b257d2dc96be --- .../components/text/BaseTextProps.cpp | 25 ++++++++----------- .../renderer/components/view/ViewProps.cpp | 21 +++++++--------- .../core/ConcreteComponentDescriptor.h | 2 +- ReactCommon/react/renderer/core/PropsMacros.h | 2 +- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/ReactCommon/react/renderer/components/text/BaseTextProps.cpp index b660b6d7cbbc3a..88189288fdfb6c 100644 --- a/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/ReactCommon/react/renderer/components/text/BaseTextProps.cpp @@ -12,20 +12,17 @@ #include #include -#define GET_FIELD_VALUE(field, fieldName, defaultValue, rawValue) \ - (rawValue.hasValue() ? ([&rawValue, &context] { \ - decltype(defaultValue) res; \ - fromRawValue(context, rawValue, res); \ - return res; \ - }()) \ - : defaultValue); - -#define REBUILD_FIELD_SWITCH_CASE( \ - defaults, rawValue, property, field, fieldName) \ - case CONSTEXPR_RAW_PROPS_KEY_HASH(fieldName): { \ - property.field = \ - GET_FIELD_VALUE(field, fieldName, defaults.field, rawValue); \ - return; \ +#define REBUILD_FIELD_SWITCH_CASE( \ + defaults, rawValue, property, field, fieldName) \ + case CONSTEXPR_RAW_PROPS_KEY_HASH(fieldName): { \ + if (rawValue.hasValue()) { \ + decltype(defaults.field) res; \ + fromRawValue(context, rawValue, res); \ + property.field = res; \ + } else { \ + property.field = defaults.field; \ + } \ + return; \ } namespace facebook { diff --git a/ReactCommon/react/renderer/components/view/ViewProps.cpp b/ReactCommon/react/renderer/components/view/ViewProps.cpp index 10067604153056..3bdc56de17940f 100644 --- a/ReactCommon/react/renderer/components/view/ViewProps.cpp +++ b/ReactCommon/react/renderer/components/view/ViewProps.cpp @@ -258,18 +258,15 @@ ViewProps::ViewProps( #endif {}; -#define VIEW_EVENT_CASE(eventType, eventString) \ - case CONSTEXPR_RAW_PROPS_KEY_HASH(eventString): { \ - ViewEvents defaultViewEvents{}; \ - events[eventType] = [ defaultViewEvents, &value, &context ]() constexpr { \ - bool res = defaultViewEvents[eventType]; \ - if (value.hasValue()) { \ - fromRawValue(context, value, res); \ - } \ - return res; \ - } \ - (); \ - return; \ +#define VIEW_EVENT_CASE(eventType, eventString) \ + case CONSTEXPR_RAW_PROPS_KEY_HASH(eventString): { \ + ViewEvents defaultViewEvents{}; \ + bool res = defaultViewEvents[eventType]; \ + if (value.hasValue()) { \ + fromRawValue(context, value, res); \ + } \ + events[eventType] = res; \ + return; \ } void ViewProps::setProp( diff --git a/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index b2657e037f0c2f..77c60b0a1356dd 100644 --- a/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -119,7 +119,7 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { rawProps.iterateOverValues([&](RawPropsPropNameHash hash, const char *propName, RawValue const &fn) { - shadowNodeProps.get()->Props::setProp(context, hash, propName, fn); + shadowNodeProps.get()->setProp(context, hash, propName, fn); }); } diff --git a/ReactCommon/react/renderer/core/PropsMacros.h b/ReactCommon/react/renderer/core/PropsMacros.h index 9064031bac8606..d41b0c68d2f7ce 100644 --- a/ReactCommon/react/renderer/core/PropsMacros.h +++ b/ReactCommon/react/renderer/core/PropsMacros.h @@ -19,7 +19,7 @@ // Get hash at compile-time. sizeof(str) - 1 == strlen #define CONSTEXPR_RAW_PROPS_KEY_HASH(s) \ - ([]() constexpr { \ + ([]() constexpr->RawPropsPropNameHash { \ CLANG_PRAGMA("clang diagnostic push") \ CLANG_PRAGMA("clang diagnostic ignored \"-Wshadow\"") \ return folly::hash::fnv32_buf(s, sizeof(s) - 1); \