diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index e0cc116215..02e5ac488c 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -19,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -190,8 +190,9 @@ int32_t gConfigInstanceCount = 0; YOGA_EXPORT WIN_EXPORT YGNodeRef YGNodeNewWithConfig(const YGConfigRef config) { auto* node = new yoga::Node{static_cast(config)}; - YGAssert(config != nullptr, "Tried to construct YGNode with null config"); - YGAssertWithConfig( + yoga::assertFatal( + config != nullptr, "Tried to construct YGNode with null config"); + yoga::assertFatalWithConfig( config, node != nullptr, "Could not allocate memory for node"); Event::publish(node, {config}); @@ -210,7 +211,7 @@ YOGA_EXPORT YGNodeRef YGNodeNew(void) { YOGA_EXPORT YGNodeRef YGNodeClone(YGNodeRef oldNodeRef) { auto oldNode = static_cast(oldNodeRef); auto node = new yoga::Node(*oldNode); - YGAssertWithConfig( + yoga::assertFatalWithConfig( oldNode->getConfig(), node != nullptr, "Could not allocate memory for node"); @@ -312,12 +313,12 @@ YOGA_EXPORT void YGNodeInsertChild( auto owner = static_cast(ownerRef); auto child = static_cast(childRef); - YGAssertWithNode( + yoga::assertFatalWithNode( owner, child->getOwner() == nullptr, "Child already has a owner, it must be removed first."); - YGAssertWithNode( + yoga::assertFatalWithNode( owner, !owner->hasMeasureFunc(), "Cannot add child: Nodes with measure functions cannot have children."); @@ -456,7 +457,7 @@ YOGA_EXPORT YGNodeRef YGNodeGetParent(const YGNodeRef node) { YOGA_EXPORT void YGNodeMarkDirty(const YGNodeRef nodeRef) { auto node = static_cast(nodeRef); - YGAssertWithNode( + yoga::assertFatalWithNode( node, node->hasMeasureFunc(), "Only leaf nodes with custom measure functions " @@ -943,7 +944,7 @@ YOGA_EXPORT YGValue YGNodeStyleGetMaxHeight(const YGNodeConstRef node) { YOGA_EXPORT type YGNodeLayoutGet##name( \ const YGNodeRef nodeRef, const YGEdge edge) { \ auto node = static_cast(nodeRef); \ - YGAssertWithNode( \ + yoga::assertFatalWithNode( \ node, \ edge <= YGEdgeEnd, \ "Cannot get layout properties of multi-edge shorthands"); \ @@ -1053,7 +1054,7 @@ static float YGBaseline(yoga::Node* node, void* layoutContext) { Event::publish(node); - YGAssertWithNode( + yoga::assertFatalWithNode( node, !yoga::isUndefined(baseline), "Expect custom baseline function to not return NaN"); @@ -1669,7 +1670,7 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions( LayoutData& layoutMarkerData, void* const layoutContext, const LayoutPassReason reason) { - YGAssertWithNode( + yoga::assertFatalWithNode( node, node->hasMeasureFunc(), "Expected node to have custom measure function"); @@ -2731,14 +2732,14 @@ static void YGNodelayoutImpl( const uint32_t depth, const uint32_t generationCount, const LayoutPassReason reason) { - YGAssertWithNode( + yoga::assertFatalWithNode( node, yoga::isUndefined(availableWidth) ? widthMeasureMode == YGMeasureModeUndefined : true, "availableWidth is indefinite so widthMeasureMode must be " "YGMeasureModeUndefined"); - YGAssertWithNode( + yoga::assertFatalWithNode( node, yoga::isUndefined(availableHeight) ? heightMeasureMode == YGMeasureModeUndefined @@ -4089,7 +4090,7 @@ bool YGLayoutNodeInternal( YOGA_EXPORT void YGConfigSetPointScaleFactor( const YGConfigRef config, const float pixelsInPoint) { - YGAssertWithConfig( + yoga::assertFatalWithConfig( config, pixelsInPoint >= 0.0f, "Scale factor should not be less than zero"); @@ -4287,56 +4288,6 @@ YOGA_EXPORT void YGConfigSetLogger(const YGConfigRef config, YGLogger logger) { } } -static void fatalWithMessage(const char* message) { -#if defined(__cpp_exceptions) - throw std::logic_error(message); -#else - std::terminate(); -#endif -} - -void YGAssert(const bool condition, const char* message) { - if (!condition) { - yoga::log( - static_cast(nullptr), - YGLogLevelFatal, - nullptr, - "%s\n", - message); - fatalWithMessage(message); - } -} - -void YGAssertWithNode( - const YGNodeRef node, - const bool condition, - const char* message) { - if (!condition) { - yoga::log( - static_cast(node), - YGLogLevelFatal, - nullptr, - "%s\n", - message); - fatalWithMessage(message); - } -} - -void YGAssertWithConfig( - const YGConfigRef config, - const bool condition, - const char* message) { - if (!condition) { - yoga::log( - static_cast(config), - YGLogLevelFatal, - nullptr, - "%s\n", - message); - fatalWithMessage(message); - } -} - YOGA_EXPORT void YGConfigSetExperimentalFeatureEnabled( const YGConfigRef config, const YGExperimentalFeature feature, diff --git a/yoga/Yoga.h b/yoga/Yoga.h index 0c8986896c..8f797f887b 100644 --- a/yoga/Yoga.h +++ b/yoga/Yoga.h @@ -7,16 +7,9 @@ #pragma once -#include -#include #include -#include -#include -#include - -#ifndef __cplusplus #include -#endif +#include #include #include @@ -303,15 +296,6 @@ WIN_EXPORT float YGNodeLayoutGetBorder(YGNodeRef node, YGEdge edge); WIN_EXPORT float YGNodeLayoutGetPadding(YGNodeRef node, YGEdge edge); WIN_EXPORT void YGConfigSetLogger(YGConfigRef config, YGLogger logger); -WIN_EXPORT void YGAssert(bool condition, const char* message); -WIN_EXPORT void YGAssertWithNode( - YGNodeRef node, - bool condition, - const char* message); -WIN_EXPORT void YGAssertWithConfig( - YGConfigRef config, - bool condition, - const char* message); // Set this to number of pixels in 1 point to round calculation results If you // want to avoid rounding - set PointScaleFactor to 0 WIN_EXPORT void YGConfigSetPointScaleFactor( diff --git a/yoga/algorithm/FlexDirection.h b/yoga/algorithm/FlexDirection.h index 9cb87462aa..b6e01190d7 100644 --- a/yoga/algorithm/FlexDirection.h +++ b/yoga/algorithm/FlexDirection.h @@ -9,6 +9,8 @@ #include +#include + namespace facebook::yoga { inline bool isRow(const YGFlexDirection flexDirection) { @@ -55,11 +57,7 @@ inline YGEdge leadingEdge(const YGFlexDirection flexDirection) { return YGEdgeRight; } - YGAssert(false, "Invalid YGFlexDirection"); - - // Avoid "not all control paths return a value" warning until next diff adds - // assert with [[noreturn]] - return YGEdgeTop; + fatalWithMessage("Invalid YGFlexDirection"); } inline YGEdge trailingEdge(const YGFlexDirection flexDirection) { @@ -74,11 +72,7 @@ inline YGEdge trailingEdge(const YGFlexDirection flexDirection) { return YGEdgeLeft; } - YGAssert(false, "Invalid YGFlexDirection"); - - // Avoid "not all control paths return a value" warning until next diff adds - // assert with [[noreturn]] - return YGEdgeTop; + fatalWithMessage("Invalid YGFlexDirection"); } } // namespace facebook::yoga diff --git a/yoga/debug/AssertFatal.cpp b/yoga/debug/AssertFatal.cpp new file mode 100644 index 0000000000..e079777c77 --- /dev/null +++ b/yoga/debug/AssertFatal.cpp @@ -0,0 +1,65 @@ +/* + * 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 + +#include +#include + +namespace facebook::yoga { + +[[noreturn]] void fatalWithMessage(const char* message) { +#if defined(__cpp_exceptions) + throw std::logic_error(message); +#else + std::terminate(); +#endif +} + +void assertFatal(const bool condition, const char* message) { + if (!condition) { + yoga::log( + static_cast(nullptr), + YGLogLevelFatal, + nullptr, + "%s\n", + message); + fatalWithMessage(message); + } +} + +void assertFatalWithNode( + const YGNodeRef node, + const bool condition, + const char* message) { + if (!condition) { + yoga::log( + static_cast(node), + YGLogLevelFatal, + nullptr, + "%s\n", + message); + fatalWithMessage(message); + } +} + +void assertFatalWithConfig( + const YGConfigRef config, + const bool condition, + const char* message) { + if (!condition) { + yoga::log( + static_cast(config), + YGLogLevelFatal, + nullptr, + "%s\n", + message); + fatalWithMessage(message); + } +} + +} // namespace facebook::yoga diff --git a/yoga/debug/AssertFatal.h b/yoga/debug/AssertFatal.h new file mode 100644 index 0000000000..461eb8ed44 --- /dev/null +++ b/yoga/debug/AssertFatal.h @@ -0,0 +1,25 @@ +/* + * 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 + +namespace facebook::yoga { + +[[noreturn]] void fatalWithMessage(const char* message); + +void assertFatal(bool condition, const char* message); +void assertFatalWithNode(YGNodeRef node, bool condition, const char* message); +void assertFatalWithConfig( + YGConfigRef config, + bool condition, + const char* message); + +} // namespace facebook::yoga diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index 0eca4e115e..d561d31477 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -10,13 +10,15 @@ #include #include +#include #include #include namespace facebook::yoga { Node::Node(yoga::Config* config) : config_{config} { - YGAssert(config != nullptr, "Attempting to construct Node with null config"); + yoga::assertFatal( + config != nullptr, "Attempting to construct Node with null config"); flags_.hasNewLayout = true; if (config->useWebDefaults()) { @@ -234,7 +236,7 @@ void Node::setMeasureFunc(decltype(Node::measure_) measureFunc) { // places in Litho setNodeType(YGNodeTypeDefault); } else { - YGAssertWithNode( + yoga::assertFatalWithNode( this, children_.size() == 0, "Cannot set measure function: Nodes with measure functions cannot have " @@ -274,8 +276,9 @@ void Node::insertChild(Node* child, uint32_t index) { } void Node::setConfig(yoga::Config* config) { - YGAssert(config != nullptr, "Attempting to set a null config on a Node"); - YGAssertWithConfig( + yoga::assertFatal( + config != nullptr, "Attempting to set a null config on a Node"); + yoga::assertFatalWithConfig( config, config->useWebDefaults() == config_->useWebDefaults(), "UseWebDefaults may not be changed after constructing a Node"); @@ -592,11 +595,11 @@ FloatOptional Node::getTrailingPaddingAndBorder( } void Node::reset() { - YGAssertWithNode( + yoga::assertFatalWithNode( this, children_.size() == 0, "Cannot reset a node which still has children attached"); - YGAssertWithNode( + yoga::assertFatalWithNode( this, owner_ == nullptr, "Cannot reset a node still attached to a owner"); *this = Node{getConfig()};