Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -259,14 +259,14 @@ [OFAllocFailedException class]; @throw (OFAllocFailedException*) &alloc_failed_exception; } - if (src->forwarding == src) - (*dst)->forwarding = *dst; - memcpy(*dst, src, src->size); + + if (src == src->forwarding) + (*dst)->forwarding = *dst; if (src->flags & OF_BLOCK_HAS_COPY_DISPOSE) src->byref_keep(*dst, src); } else *dst = src; Index: tests/OFBlockTests.m ================================================================== --- tests/OFBlockTests.m +++ tests/OFBlockTests.m @@ -33,18 +33,27 @@ extern void *_NSConcreteStackBlock; extern void *_NSConcreteGlobalBlock; extern void *_NSConcreteMallocBlock; static void (^g)() = ^ {}; + +static int +(^returnStackBlock(void))(void) +{ + __block int i = 0; + + return Block_copy(^ int { return ++i; }); +} @implementation TestsAppDelegate (OFBlockTests) - (void)blockTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; __block int x; - void (^s)() = ^ { x = 0; }; - void (^m)(); + void (^s)(void) = ^ { x = 0; }; + void (^m)(void); + int (^v)(void); TEST(@"Class of stack block", (Class)&_NSConcreteStackBlock == objc_getClass("OFStackBlock") && [s isKindOfClass: [OFBlock class]]) @@ -58,10 +67,13 @@ TEST(@"Copying a stack block", (m = [[s copy] autorelease]) && [m class] == objc_getClass("OFMallocBlock") && [m isKindOfClass: [OFBlock class]]) + TEST(@"Copying a stack block and using its variable", + (v = returnStackBlock()) && v() == 1 && v() == 2 && v() == 3) + TEST(@"Copying a global block", (id)g == [[g copy] autorelease]) TEST(@"Copying a malloc block", (id)m == [m copy] && [m retainCount] == 2)