diff --git a/Source/Base/ASAssert.h b/Source/Base/ASAssert.h index 20476f450..47022c5ee 100644 --- a/Source/Base/ASAssert.h +++ b/Source/Base/ASAssert.h @@ -69,9 +69,11 @@ #define ASDisplayNodeErrorDomain @"ASDisplayNodeErrorDomain" #define ASDisplayNodeNonFatalErrorCode 1 -#define ASDisplayNodeAssertNonFatal(condition, desc, ...) \ - ASDisplayNodeAssert(condition, desc, ##__VA_ARGS__); \ - if (condition == NO) { \ +/// Returns YES if assertion passed, NO otherwise. +#define ASDisplayNodeAssertNonFatal(condition, desc, ...) ({ \ + BOOL __evaluated = condition; \ + if (__evaluated == NO) { \ + ASDisplayNodeFailAssert(desc, ##__VA_ARGS__); \ ASDisplayNodeNonFatalErrorBlock block = [ASDisplayNode nonFatalErrorBlock]; \ if (block != nil) { \ NSDictionary *userInfo = nil; \ @@ -81,4 +83,6 @@ NSError *error = [NSError errorWithDomain:ASDisplayNodeErrorDomain code:ASDisplayNodeNonFatalErrorCode userInfo:userInfo]; \ block(error); \ } \ - } + } \ + __evaluated; \ +}) \ diff --git a/Source/Details/_ASDisplayLayer.mm b/Source/Details/_ASDisplayLayer.mm index c61861138..ea26490ec 100644 --- a/Source/Details/_ASDisplayLayer.mm +++ b/Source/Details/_ASDisplayLayer.mm @@ -100,6 +100,10 @@ - (void)setDisplaySuspended:(BOOL)displaySuspended - (void)setBounds:(CGRect)bounds { + BOOL valid = ASDisplayNodeAssertNonFatal(ASIsCGRectValidForLayout(bounds), @"Caught attempt to set invalid bounds %@ on %@.", NSStringFromCGRect(bounds), self); + if (!valid) { + return; + } if (_delegateFlags.delegateDidChangeBounds) { CGRect oldBounds = self.bounds; [super setBounds:bounds];