Skip to content

Commit

Permalink
Fix regression when setting shadow node properties in D38272966 (gith…
Browse files Browse the repository at this point in the history
…ub 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
  • Loading branch information
rshest authored and facebook-github-bot committed Aug 2, 2022
1 parent c7c263d commit a142a78
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 28 deletions.
25 changes: 11 additions & 14 deletions ReactCommon/react/renderer/components/text/BaseTextProps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,17 @@
#include <react/renderer/debug/DebugStringConvertibleItem.h>
#include <react/renderer/graphics/conversions.h>

#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 {
Expand Down
21 changes: 9 additions & 12 deletions ReactCommon/react/renderer/components/view/ViewProps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}

Expand Down
2 changes: 1 addition & 1 deletion ReactCommon/react/renderer/core/PropsMacros.h
Original file line number Diff line number Diff line change
Expand Up @@ -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); \
Expand Down

0 comments on commit a142a78

Please sign in to comment.