gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

_Block_object_assign crash


From: lorenb
Subject: _Block_object_assign crash
Date: Mon, 27 Jun 2011 17:51:48 -0700 (PDT)

I'm in the process of tracking down a weird behavioral difference between the way Blocks work on Mac OS X and the way they work with GNUstep + libobjc2. Unfortunately I haven't yet distilled the problem I'm seeing, but I may have stumbled on a different one. Env: 64 bit Debian, GNstep + libobjc2 compiled with llvm+clang 2.9. (example compiled with llvm+clang 2.9 as well). On Mac it runs correctly (maybe it shouldn't?):
2011-06-27 20:32:49.233 a.out[16772:903] 0
2011-06-27 20:32:49.236 a.out[16772:903] 1 0x7fff5fbff828
2011-06-27 20:32:49.236 a.out[16772:903] 2 0x100110628
2011-06-27 20:32:49.237 a.out[16772:903] 1
2011-06-27 20:32:49.237 a.out[16772:903] a 0x100110628
2011-06-27 20:32:49.238 a.out[16772:903] b 0x100110628
2011-06-27 20:32:49.238 a.out[16772:903] 2
On Linux I get a SIGSEGV in _Block_object_assign Before I go diving into the blocks runtime I figured it couldn't hurt to share here, hopefully someone smarter than me might know what's going on (or why my contrived example shouldn't have worked at all). Thanks, Loren
#import <Foundation/Foundation.h>

int main(int argc, char *argv[])
{
	__block void(^a)(void) = NULL;
	__block void(^b)(void) = NULL;
	
	void (^master)(int) = Block_copy(^(int n){
		
		__block id x = nil;
		
		if(n == 0) {
			NSLog(@"0");
			
			NSLog(@"1 %p", &x);
			a = Block_copy(^{
				NSLog(@"a %p", &x);
			});

			NSLog(@"2 %p", &x);
			b = Block_copy(^{
				NSLog(@"b %p", &x);
			});
		} else if(n == 1) {
			NSLog(@"1");
			
			a();
			b();
		} else if(n == 2) {
			NSLog(@"2");
			
			Block_release(a);
			Block_release(b);
		}
	});
	
	master(0);
	master(1);
	master(2);
	
	Block_release(master);
	
	return 0;
}


View this message in context: _Block_object_assign crash
Sent from the GNUstep - Dev mailing list archive at Nabble.com.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]