libs-base/Source/GSBlocks.m
rfm ba31196455 fixup ugly coding stype to improve maintainability
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32384 72102866-910b-0410-8b05-ffd578937521
2011-02-26 21:42:20 +00:00

61 lines
1.2 KiB
Objective-C

#import <Foundation/NSObject.h>
/* Declare the block copy functions ourself so that we don't depend on a
* specific header location.
*/
void *_Block_copy(void *);
void _Block_release(void *);
@interface GSBlock : NSObject
@end
@implementation GSBlock
+ (void) load
{
unsigned int methodCount;
Method *m = NULL;
Method *methods = class_copyMethodList(self, &methodCount);
id blockClass = objc_lookUpClass("_NSBlock");
Protocol *nscopying = NULL;
/* If we don't have an _NSBlock class, we don't have blocks support in the
* runtime, so give up.
*/
if (nil == blockClass)
{
return;
}
/* Copy all of the methods in this class onto the block-runtime-provided
* _NSBlock
*/
for (m = methods; NULL != *m; m++)
{
class_addMethod(blockClass, method_getName(*m),
method_getImplementation(*m), method_getTypeEncoding(*m));
}
nscopying = objc_getProtocol("NSCopying");
class_addProtocol(blockClass, nscopying);
}
- (id) copyWithZone: (NSZone*)aZone
{
return _Block_copy(self);
}
- (id) copy
{
return _Block_copy(self);
}
- (id) retain
{
return _Block_copy(self);
}
- (void) release
{
_Block_release(self);
}
@end