Skip to content

Commit 1d9ed87

Browse files
javachemeta-codesync[bot]
authored andcommitted
Make the default configuration constexpr (#59515)
Summary: Pull Request resolved: #59515 X-link: react/yoga#2050 Constant-initialize the default configuration and resolve its default logger only when logging. Expose the configuration to constant evaluation on non-Windows platforms; retain the out-of-line Windows getter so DLL consumers continue sharing the library-owned singleton. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D127577561 fbshipit-source-id: 017d21f8b797e412649fde0b5829df17f464436c
1 parent a8bdbf4 commit 1d9ed87

15 files changed

Lines changed: 59 additions & 27 deletions

‎packages/react-native/ReactCommon/yoga/test/BaselineTest.cpp‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@
1919
namespace facebook::yoga {
2020
namespace {
2121

22+
TEST(ConfigTest, defaultConfigIsConstexpr) {
23+
#if defined(_WIN32)
24+
const auto& config = Config::getDefault();
25+
const auto copy = config;
26+
#else
27+
constexpr const auto& config = Config::getDefault();
28+
constexpr auto copy = config;
29+
static_assert(&config == &Config::getDefault());
30+
#endif
31+
32+
EXPECT_EQ(&config, YGConfigGetDefault());
33+
EXPECT_EQ(copy.getPointScaleFactor(), config.getPointScaleFactor());
34+
}
35+
2236
void setMeasuredSize(Node& node, float width, float height) {
2337
node.setLayoutMeasuredDimension(width, Dimension::Width);
2438
node.setLayoutMeasuredDimension(height, Dimension::Height);

‎packages/react-native/ReactCommon/yoga/yoga/config/Config.cpp‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ void Config::log(
106106
LogLevel logLevel,
107107
const char* format,
108108
va_list args) const {
109-
logger_(this, node, unscopedEnum(logLevel), format, args);
109+
const auto logger = logger_ != nullptr ? logger_ : getDefaultLogger();
110+
logger(this, node, unscopedEnum(logLevel), format, args);
110111
}
111112

112113
void Config::setCloneNodeCallback(YGCloneNodeFunc cloneNode) {
@@ -127,9 +128,11 @@ YGNodeRef Config::cloneNode(
127128
return clone;
128129
}
129130

131+
#if defined(_WIN32)
130132
/*static*/ const Config& Config::getDefault() {
131-
static Config config{getDefaultLogger()};
133+
static constexpr Config config{nullptr};
132134
return config;
133135
}
136+
#endif
134137

135138
} // namespace facebook::yoga

‎packages/react-native/ReactCommon/yoga/yoga/config/Config.h‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ bool configUpdateInvalidatesLayout(
3232

3333
class YG_EXPORT Config : public ::YGConfig {
3434
public:
35-
explicit Config(YGLogger logger) : logger_{logger} {}
35+
explicit constexpr Config(YGLogger logger) : logger_{logger} {}
3636

3737
void setUseWebDefaults(bool useWebDefaults);
3838
bool useWebDefaults() const;
@@ -66,9 +66,20 @@ class YG_EXPORT Config : public ::YGConfig {
6666
YGNodeRef
6767
cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
6868

69+
#if defined(_WIN32)
6970
static const Config& getDefault();
71+
#else
72+
static constexpr const Config& getDefault() {
73+
return defaultConfig_;
74+
}
75+
#endif
7076

7177
private:
78+
#if !defined(_WIN32)
79+
// NOLINTNEXTLINE(facebook-hte-NonPodStaticDeclaration)
80+
static constinit const Config defaultConfig_;
81+
#endif
82+
7283
YGCloneNodeFunc cloneNodeCallback_{nullptr};
7384
YGLogger logger_{};
7485

@@ -82,6 +93,10 @@ class YG_EXPORT Config : public ::YGConfig {
8293
void* context_ = nullptr;
8394
};
8495

96+
#if !defined(_WIN32)
97+
inline constexpr Config Config::defaultConfig_{nullptr};
98+
#endif
99+
85100
inline Config* resolveRef(const YGConfigRef ref) {
86101
return static_cast<Config*>(ref);
87102
}

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6560,13 +6560,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
65606560
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
65616561

65626562
class facebook::yoga::Config : public YGConfig {
6563-
public Config(YGLogger logger);
65646563
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
65656564
public bool hasErrata(facebook::yoga::Errata errata) const;
65666565
public bool useWebDefaults() const;
6566+
public constexpr Config(YGLogger logger);
65676567
public facebook::yoga::Errata getErrata() const;
65686568
public float getPointScaleFactor() const;
6569-
public static const facebook::yoga::Config& getDefault();
6569+
public static constexpr const facebook::yoga::Config& getDefault();
65706570
public uint32_t getVersion() const noexcept;
65716571
public void addErrata(facebook::yoga::Errata errata);
65726572
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11010,13 +11010,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
1101011010
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
1101111011

1101211012
class facebook::yoga::Config : public YGConfig {
11013-
public Config(YGLogger logger);
1101411013
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
1101511014
public bool hasErrata(facebook::yoga::Errata errata) const;
1101611015
public bool useWebDefaults() const;
11016+
public constexpr Config(YGLogger logger);
1101711017
public facebook::yoga::Errata getErrata() const;
1101811018
public float getPointScaleFactor() const;
11019-
public static const facebook::yoga::Config& getDefault();
11019+
public static constexpr const facebook::yoga::Config& getDefault();
1102011020
public uint32_t getVersion() const noexcept;
1102111021
public void addErrata(facebook::yoga::Errata errata);
1102211022
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6409,13 +6409,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
64096409
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
64106410

64116411
class facebook::yoga::Config : public YGConfig {
6412-
public Config(YGLogger logger);
64136412
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
64146413
public bool hasErrata(facebook::yoga::Errata errata) const;
64156414
public bool useWebDefaults() const;
6415+
public constexpr Config(YGLogger logger);
64166416
public facebook::yoga::Errata getErrata() const;
64176417
public float getPointScaleFactor() const;
6418-
public static const facebook::yoga::Config& getDefault();
6418+
public static constexpr const facebook::yoga::Config& getDefault();
64196419
public uint32_t getVersion() const noexcept;
64206420
public void addErrata(facebook::yoga::Errata errata);
64216421
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6409,13 +6409,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
64096409
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
64106410

64116411
class facebook::yoga::Config : public YGConfig {
6412-
public Config(YGLogger logger);
64136412
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
64146413
public bool hasErrata(facebook::yoga::Errata errata) const;
64156414
public bool useWebDefaults() const;
6415+
public constexpr Config(YGLogger logger);
64166416
public facebook::yoga::Errata getErrata() const;
64176417
public float getPointScaleFactor() const;
6418-
public static const facebook::yoga::Config& getDefault();
6418+
public static constexpr const facebook::yoga::Config& getDefault();
64196419
public uint32_t getVersion() const noexcept;
64206420
public void addErrata(facebook::yoga::Errata errata);
64216421
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8313,13 +8313,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
83138313
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
83148314

83158315
class facebook::yoga::Config : public YGConfig {
8316-
public Config(YGLogger logger);
83178316
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
83188317
public bool hasErrata(facebook::yoga::Errata errata) const;
83198318
public bool useWebDefaults() const;
8319+
public constexpr Config(YGLogger logger);
83208320
public facebook::yoga::Errata getErrata() const;
83218321
public float getPointScaleFactor() const;
8322-
public static const facebook::yoga::Config& getDefault();
8322+
public static constexpr const facebook::yoga::Config& getDefault();
83238323
public uint32_t getVersion() const noexcept;
83248324
public void addErrata(facebook::yoga::Errata errata);
83258325
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12796,13 +12796,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
1279612796
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
1279712797

1279812798
class facebook::yoga::Config : public YGConfig {
12799-
public Config(YGLogger logger);
1280012799
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
1280112800
public bool hasErrata(facebook::yoga::Errata errata) const;
1280212801
public bool useWebDefaults() const;
12802+
public constexpr Config(YGLogger logger);
1280312803
public facebook::yoga::Errata getErrata() const;
1280412804
public float getPointScaleFactor() const;
12805-
public static const facebook::yoga::Config& getDefault();
12805+
public static constexpr const facebook::yoga::Config& getDefault();
1280612806
public uint32_t getVersion() const noexcept;
1280712807
public void addErrata(facebook::yoga::Errata errata);
1280812808
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

‎scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8164,13 +8164,13 @@ constexpr bool facebook::yoga::operator>=(facebook::yoga::FloatOptional lhs, fac
81648164
constexpr facebook::yoga::FloatOptional facebook::yoga::operator+(facebook::yoga::FloatOptional lhs, facebook::yoga::FloatOptional rhs);
81658165

81668166
class facebook::yoga::Config : public YGConfig {
8167-
public Config(YGLogger logger);
81688167
public YGNodeRef cloneNode(YGNodeConstRef node, YGNodeConstRef owner, size_t childIndex) const;
81698168
public bool hasErrata(facebook::yoga::Errata errata) const;
81708169
public bool useWebDefaults() const;
8170+
public constexpr Config(YGLogger logger);
81718171
public facebook::yoga::Errata getErrata() const;
81728172
public float getPointScaleFactor() const;
8173-
public static const facebook::yoga::Config& getDefault();
8173+
public static constexpr const facebook::yoga::Config& getDefault();
81748174
public uint32_t getVersion() const noexcept;
81758175
public void addErrata(facebook::yoga::Errata errata);
81768176
public void log(const facebook::yoga::Node* node, facebook::yoga::LogLevel logLevel, const char* format, va_list args) const;

0 commit comments

Comments
 (0)