diff --git a/React/CSSLayout/CSSLayout.c b/React/CSSLayout/CSSLayout.c index ba1b10c6c..76f373493 100644 --- a/React/CSSLayout/CSSLayout.c +++ b/React/CSSLayout/CSSLayout.c @@ -219,6 +219,7 @@ void _CSSNodeMarkDirty(const CSSNodeRef node) { } void CSSNodeInsertChild(const CSSNodeRef node, const CSSNodeRef child, const uint32_t index) { + CSS_ASSERT(child->parent == NULL, "Child already has a parent, it must be removed first."); CSSNodeListInsert(node->children, child, index); child->parent = node; _CSSNodeMarkDirty(node); @@ -2295,3 +2296,17 @@ void CSSNodeCalculateLayout(const CSSNodeRef node, } } } + +#ifdef CSS_ASSERT_FAIL_ENABLED +static CSSAssertFailFunc gAssertFailFunc; + +void CSSAssertSetFailFunc(CSSAssertFailFunc func) { + gAssertFailFunc = func; +} + +void CSSAssertFail(const char *message) { + if (gAssertFailFunc) { + (*gAssertFailFunc)(message); + } +} +#endif diff --git a/React/CSSLayout/CSSLayout.h b/React/CSSLayout/CSSLayout.h index ea532bbb1..9c4a10121 100644 --- a/React/CSSLayout/CSSLayout.h +++ b/React/CSSLayout/CSSLayout.h @@ -122,6 +122,10 @@ typedef CSSSize (*CSSMeasureFunc)(void *context, CSSMeasureMode heightMode); typedef void (*CSSPrintFunc)(void *context); +#ifdef CSS_ASSERT_FAIL_ENABLED +typedef void (*CSSAssertFailFunc)(const char *message); +#endif + // CSSNode WIN_EXPORT CSSNodeRef CSSNodeNew(); WIN_EXPORT void CSSNodeInit(const CSSNodeRef node); @@ -206,4 +210,10 @@ CSS_NODE_LAYOUT_PROPERTY(float, Width); CSS_NODE_LAYOUT_PROPERTY(float, Height); CSS_NODE_LAYOUT_PROPERTY(CSSDirection, Direction); +#ifdef CSS_ASSERT_FAIL_ENABLED +// Assert +WIN_EXPORT void CSSAssertSetFailFunc(CSSAssertFailFunc func); +WIN_EXPORT void CSSAssertFail(const char *message); +#endif + CSS_EXTERN_C_END diff --git a/React/CSSLayout/CSSMacros.h b/React/CSSLayout/CSSMacros.h index f4e29a1e3..b9b1faad5 100644 --- a/React/CSSLayout/CSSMacros.h +++ b/React/CSSLayout/CSSMacros.h @@ -33,8 +33,16 @@ #define CSS_ABORT() #endif -#define CSS_ASSERT(X, message) \ - if (!(X)) { \ - fprintf(stderr, "%s\n", message); \ - CSS_ABORT(); \ +#if CSS_ASSERT_FAIL_ENABLED +#define CSS_ERROR_FUNC(message) CSSAssertFail(message) +#else +#define CSS_ERROR_FUNC(message) fprintf(stderr, "%s", message) +#endif + +#ifndef CSS_ASSERT +#define CSS_ASSERT(X, message) \ + if (!(X)) { \ + CSS_ERROR_FUNC(message); \ + CSS_ABORT(); \ } +#endif