mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-11 16:50:42 +00:00
Do not call handler blocks if they are nil
This commit is contained in:
parent
e68b97d58b
commit
5b151c5fa0
12 changed files with 32 additions and 33 deletions
|
@ -48,12 +48,12 @@ typedef retTy(^name)()
|
||||||
/**
|
/**
|
||||||
* Calls a block. Works irrespective of whether the compiler supports blocks.
|
* Calls a block. Works irrespective of whether the compiler supports blocks.
|
||||||
*/
|
*/
|
||||||
#define CALL_BLOCK(block, args, ...) block(args, ## __VA_ARGS__)
|
#define CALL_NON_NULL_BLOCK(block, args, ...) block(args, ## __VA_ARGS__)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls a block without arguments.
|
* Calls a block without arguments.
|
||||||
*/
|
*/
|
||||||
#define CALL_BLOCK_NO_ARGS(block) block()
|
#define CALL_NON_NULL_BLOCK_NO_ARGS(block) block()
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Fall-back versions for when the compiler doesn't have native blocks support.
|
/* Fall-back versions for when the compiler doesn't have native blocks support.
|
||||||
|
@ -76,9 +76,9 @@ typedef retTy(^name)()
|
||||||
retTy (*invoke)(void*);\
|
retTy (*invoke)(void*);\
|
||||||
} *name
|
} *name
|
||||||
|
|
||||||
#define CALL_BLOCK(block, args, ...) block->invoke(block, args, ## __VA_ARGS__)
|
#define CALL_NON_NULL_BLOCK(block, args, ...) block->invoke(block, args, ## __VA_ARGS__)
|
||||||
|
|
||||||
#define CALL_BLOCK_NO_ARGS(block) block->invoke(block)
|
#define CALL_NON_NULL_BLOCK_NO_ARGS(block) block->invoke(block)
|
||||||
#define BLOCK_SCOPE
|
#define BLOCK_SCOPE
|
||||||
|
|
||||||
#else /* GCC_VERSION >= 3000 */
|
#else /* GCC_VERSION >= 3000 */
|
||||||
|
@ -100,13 +100,16 @@ typedef retTy(^name)()
|
||||||
} *name
|
} *name
|
||||||
|
|
||||||
|
|
||||||
#define CALL_BLOCK(block, args...) block->invoke(block, args)
|
#define CALL_NON_NULL_BLOCK(block, args...) block->invoke(block, args)
|
||||||
#define CALL_BLOCK_NO_ARGS(block) block->invoke(block)
|
#define CALL_NON_NULL_BLOCK_NO_ARGS(block) block->invoke(block)
|
||||||
#define BLOCK_SCOPE
|
#define BLOCK_SCOPE
|
||||||
#endif /* GCC_VERSION >= 3000 */
|
#endif /* GCC_VERSION >= 3000 */
|
||||||
|
|
||||||
#endif /* __has_feature(blocks) */
|
#endif /* __has_feature(blocks) */
|
||||||
|
|
||||||
|
#define CALL_BLOCK(block, args...) ((NULL != block) ? CALL_NON_NULL_BLOCK(block, args) : nil)
|
||||||
|
#define CALL_BLOCK_NO_ARGS(block) ((NULL != block) ? CALL_NON_NULL_BLOCK_NO_ARGS(block) : nil)
|
||||||
|
|
||||||
#if __has_include(<objc/blocks_runtime.h>)
|
#if __has_include(<objc/blocks_runtime.h>)
|
||||||
# include <objc/blocks_runtime.h>
|
# include <objc/blocks_runtime.h>
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -148,7 +148,7 @@ GSCompareUsingDescriptorOrComparator(id first, id second, id descOrComp,
|
||||||
return [(NSSortDescriptor*)descOrComp compareObject: first
|
return [(NSSortDescriptor*)descOrComp compareObject: first
|
||||||
toObject: second];
|
toObject: second];
|
||||||
case GSComparisonTypeComparatorBlock:
|
case GSComparisonTypeComparatorBlock:
|
||||||
return CALL_BLOCK(((NSComparator)descOrComp), first, second);
|
return CALL_NON_NULL_BLOCK(((NSComparator)descOrComp), first, second);
|
||||||
|
|
||||||
case GSComparisonTypeFunction:
|
case GSComparisonTypeFunction:
|
||||||
return ((NSInteger (*)(id, id, void *))descOrComp)(first,
|
return ((NSInteger (*)(id, id, void *))descOrComp)(first,
|
||||||
|
|
|
@ -1146,7 +1146,7 @@ compare(id elem1, id elem2, void* context)
|
||||||
}
|
}
|
||||||
if (range.length == 1)
|
if (range.length == 1)
|
||||||
{
|
{
|
||||||
switch (CALL_BLOCK(comparator, key, [self objectAtIndex: range.location]))
|
switch (CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: range.location]))
|
||||||
{
|
{
|
||||||
case NSOrderedSame:
|
case NSOrderedSame:
|
||||||
return range.location;
|
return range.location;
|
||||||
|
@ -1212,7 +1212,7 @@ compare(id elem1, id elem2, void* context)
|
||||||
* For a search from the left, we'd have the correct index anyways. Check
|
* For a search from the left, we'd have the correct index anyways. Check
|
||||||
* whether it's equal to the key and return NSNotFound otherwise
|
* whether it's equal to the key and return NSNotFound otherwise
|
||||||
*/
|
*/
|
||||||
return (NSOrderedSame == CALL_BLOCK(comparator,
|
return (NSOrderedSame == CALL_NON_NULL_BLOCK(comparator,
|
||||||
key, [self objectAtIndex: index]) ? index : NSNotFound);
|
key, [self objectAtIndex: index]) ? index : NSNotFound);
|
||||||
}
|
}
|
||||||
// Never reached
|
// Never reached
|
||||||
|
@ -1858,10 +1858,10 @@ compare(id elem1, id elem2, void* context)
|
||||||
}
|
}
|
||||||
else // call block directly
|
else // call block directly
|
||||||
# endif
|
# endif
|
||||||
if (CALL_BLOCK(predicate, obj, count, &shouldStop))
|
if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop))
|
||||||
{
|
{
|
||||||
/* TODO: It would be more efficient to collect an NSRange and only
|
/* TODO: It would be more efficient to collect an NSRange and only
|
||||||
* pass it to the index set when CALL_BLOCK returned NO. */
|
* pass it to the index set when CALL_NON_NULL_BLOCK returned NO. */
|
||||||
[set addIndex: count];
|
[set addIndex: count];
|
||||||
}
|
}
|
||||||
if (shouldStop)
|
if (shouldStop)
|
||||||
|
@ -1959,7 +1959,7 @@ compare(id elem1, id elem2, void* context)
|
||||||
}
|
}
|
||||||
else // call block directly
|
else // call block directly
|
||||||
# endif
|
# endif
|
||||||
if (CALL_BLOCK(predicate, obj, count, &shouldStop))
|
if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop))
|
||||||
{
|
{
|
||||||
index = count;
|
index = count;
|
||||||
shouldStop = YES;
|
shouldStop = YES;
|
||||||
|
|
|
@ -3579,7 +3579,7 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
||||||
{
|
{
|
||||||
if (deallocator != NULL)
|
if (deallocator != NULL)
|
||||||
{
|
{
|
||||||
CALL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, length);
|
CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, length);
|
||||||
DESTROY(deallocator);
|
DESTROY(deallocator);
|
||||||
}
|
}
|
||||||
// Clear out the ivars so that super doesn't double free.
|
// Clear out the ivars so that super doesn't double free.
|
||||||
|
@ -4442,7 +4442,7 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
||||||
{
|
{
|
||||||
if (deallocator != NULL)
|
if (deallocator != NULL)
|
||||||
{
|
{
|
||||||
CALL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
||||||
// Clear out the ivars so that super doesn't double free.
|
// Clear out the ivars so that super doesn't double free.
|
||||||
bytes = NULL;
|
bytes = NULL;
|
||||||
length = 0;
|
length = 0;
|
||||||
|
@ -4472,7 +4472,7 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
||||||
memcpy(tmp, bytes, capacity < size ? capacity : size);
|
memcpy(tmp, bytes, capacity < size ? capacity : size);
|
||||||
if (deallocator != NULL)
|
if (deallocator != NULL)
|
||||||
{
|
{
|
||||||
CALL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
||||||
DESTROY(deallocator);
|
DESTROY(deallocator);
|
||||||
zone = NSDefaultMallocZone();
|
zone = NSDefaultMallocZone();
|
||||||
}
|
}
|
||||||
|
@ -4483,7 +4483,7 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
||||||
}
|
}
|
||||||
else if (deallocator != NULL)
|
else if (deallocator != NULL)
|
||||||
{
|
{
|
||||||
CALL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity);
|
||||||
DESTROY(deallocator);
|
DESTROY(deallocator);
|
||||||
zone = NSDefaultMallocZone();
|
zone = NSDefaultMallocZone();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1071,7 +1071,7 @@ compareIt(id o1, id o2, void* context)
|
||||||
}
|
}
|
||||||
else // call block directly
|
else // call block directly
|
||||||
#endif
|
#endif
|
||||||
if (CALL_BLOCK(aPredicate, key, obj, &shouldStop))
|
if (CALL_NON_NULL_BLOCK(aPredicate, key, obj, &shouldStop))
|
||||||
{
|
{
|
||||||
addObject(buildSet, addObjectSelector, key);
|
addObject(buildSet, addObjectSelector, key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2900,7 +2900,7 @@ static inline void gsedRelease(GSEnumeratedDirectory X)
|
||||||
_currentFilePath, [NSError _last]);
|
_currentFilePath, [NSError _last]);
|
||||||
if (_errorHandler != NULL)
|
if (_errorHandler != NULL)
|
||||||
{
|
{
|
||||||
flag = CALL_BLOCK(_errorHandler,
|
flag = CALL_NON_NULL_BLOCK(_errorHandler,
|
||||||
[NSURL fileURLWithPath: _currentFilePath],
|
[NSURL fileURLWithPath: _currentFilePath],
|
||||||
[NSError _last]);
|
[NSError _last]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -526,11 +526,7 @@ static NSArray *empty = nil;
|
||||||
internal->finished = YES;
|
internal->finished = YES;
|
||||||
[self didChangeValueForKey: @"isFinished"];
|
[self didChangeValueForKey: @"isFinished"];
|
||||||
}
|
}
|
||||||
if (NULL != internal->completionBlock)
|
CALL_BLOCK_NO_ARGS(((GSOperationCompletionBlock)internal->completionBlock));
|
||||||
{
|
|
||||||
CALL_BLOCK_NO_ARGS(
|
|
||||||
((GSOperationCompletionBlock)internal->completionBlock));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
[internal->lock unlock];
|
[internal->lock unlock];
|
||||||
}
|
}
|
||||||
|
@ -584,7 +580,7 @@ static NSArray *empty = nil;
|
||||||
|
|
||||||
while ((theBlock = (GSBlockOperationBlock)[en nextObject]) != NULL)
|
while ((theBlock = (GSBlockOperationBlock)[en nextObject]) != NULL)
|
||||||
{
|
{
|
||||||
CALL_BLOCK_NO_ARGS(theBlock);
|
CALL_NON_NULL_BLOCK_NO_ARGS(theBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -751,7 +751,7 @@ static SEL remSel;
|
||||||
}
|
}
|
||||||
if (range.length == 1)
|
if (range.length == 1)
|
||||||
{
|
{
|
||||||
switch (CALL_BLOCK(comparator, key, [self objectAtIndex: range.location]))
|
switch (CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: range.location]))
|
||||||
{
|
{
|
||||||
case NSOrderedSame:
|
case NSOrderedSame:
|
||||||
return range.location;
|
return range.location;
|
||||||
|
@ -818,7 +818,7 @@ static SEL remSel;
|
||||||
* For a search from the left, we'd have the correct index anyways. Check
|
* For a search from the left, we'd have the correct index anyways. Check
|
||||||
* whether it's equal to the key and return NSNotFound otherwise
|
* whether it's equal to the key and return NSNotFound otherwise
|
||||||
*/
|
*/
|
||||||
return (NSOrderedSame == CALL_BLOCK(comparator,
|
return (NSOrderedSame == CALL_NON_NULL_BLOCK(comparator,
|
||||||
key, [self objectAtIndex: index]) ? index : NSNotFound);
|
key, [self objectAtIndex: index]) ? index : NSNotFound);
|
||||||
}
|
}
|
||||||
// Never reached
|
// Never reached
|
||||||
|
@ -886,7 +886,7 @@ static SEL remSel;
|
||||||
}
|
}
|
||||||
else // call block directly
|
else // call block directly
|
||||||
# endif
|
# endif
|
||||||
if (CALL_BLOCK(predicate, obj, count, &shouldStop))
|
if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop))
|
||||||
{
|
{
|
||||||
index = count;
|
index = count;
|
||||||
shouldStop = YES;
|
shouldStop = YES;
|
||||||
|
@ -959,10 +959,10 @@ static SEL remSel;
|
||||||
}
|
}
|
||||||
else // call block directly
|
else // call block directly
|
||||||
# endif
|
# endif
|
||||||
if (CALL_BLOCK(predicate, obj, count, &shouldStop))
|
if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop))
|
||||||
{
|
{
|
||||||
/* TODO: It would be more efficient to collect an NSRange and only
|
/* TODO: It would be more efficient to collect an NSRange and only
|
||||||
* pass it to the index set when CALL_BLOCK returned NO. */
|
* pass it to the index set when CALL_NON_NULL_BLOCK returned NO. */
|
||||||
[set addIndex: count];
|
[set addIndex: count];
|
||||||
}
|
}
|
||||||
if (shouldStop)
|
if (shouldStop)
|
||||||
|
|
|
@ -2718,7 +2718,7 @@ GSICUStringMatchesRegex(NSString *string, NSString *regex, NSStringCompareOption
|
||||||
substitutionVariables: (GS_GENERIC_CLASS(NSDictionary,
|
substitutionVariables: (GS_GENERIC_CLASS(NSDictionary,
|
||||||
NSString*,id)*)variables
|
NSString*,id)*)variables
|
||||||
{
|
{
|
||||||
return CALL_BLOCK(_block, object, variables);
|
return CALL_NON_NULL_BLOCK(_block, object, variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) evaluateWithObject: (id)object
|
- (BOOL) evaluateWithObject: (id)object
|
||||||
|
|
|
@ -933,7 +933,7 @@ static Class NSMutableSet_concrete_class;
|
||||||
|
|
||||||
FOR_IN (id, obj, enumerator)
|
FOR_IN (id, obj, enumerator)
|
||||||
{
|
{
|
||||||
BOOL include = CALL_BLOCK(aBlock, obj, &shouldStop);
|
BOOL include = CALL_NON_NULL_BLOCK(aBlock, obj, &shouldStop);
|
||||||
|
|
||||||
if (include)
|
if (include)
|
||||||
{
|
{
|
||||||
|
|
|
@ -120,7 +120,7 @@ static BOOL initialized = NO;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = CALL_BLOCK(((NSComparator)_comparator), comparedKey1, comparedKey2);
|
result = CALL_NON_NULL_BLOCK(((NSComparator)_comparator), comparedKey1, comparedKey2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_ascending == NO)
|
if (_ascending == NO)
|
||||||
|
|
|
@ -290,7 +290,7 @@ static Class NSDate_class;
|
||||||
{
|
{
|
||||||
if ((id)_block != nil)
|
if ((id)_block != nil)
|
||||||
{
|
{
|
||||||
CALL_BLOCK(_block, self);
|
CALL_NON_NULL_BLOCK(_block, self);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue