Hi Alan,_______________________________________________Thanks for reporting that problem in the tracker. In the meantime, keeping a reference to the Proc object in the Ruby side might work around the problem (as I suspect that the proc here is being garbage-collected prematurely).@b = TestBlock.alloc.initWithBlock (@tmp ||= Proc.new { puts "hello from ruby"})LaurentOn Nov 19, 2010, at 3:25 AM, Alan Skipp wrote:Whoops, sorry about that. I find that I can get away without assigning to self in 'init' when doing a quick hack, but certainly not the recommended approach, especially when attempting to track down another bug._______________________________________________I've amended the initializer now and I still encounter the same problem.AlOn 19 Nov 2010, at 10:53, Thibault Martin-Lagardette wrote:_______________________________________________Hi Alan,I didn't look in further details yet, but clearly your initWithBlock method is wrong, it should be:- (id)initWithBlock:(void (^)())aBlock;{if ((self = [super init])) {block = [aBlock copy];NSLog(@"Block: %@", block);block();}return self;}You are not assigning `self` to be equal to what `[super init]` returns, and this is, even without macruby or blocks, prone to crashes :-)Can you try to fix this and then tell us if it's still crashing?--Thibault Martin-Lagardette
On Nov 19, 2010, at 10:14, Alan Skipp wrote:_______________________________________________I've been attempting to get an objective-c framework to work with macruby and I believe I've found a bug in the way ruby Proc objects are copied when used as objective-c blocks.The copied block doesn't seem to persist correctly beyond the scope in which it was copied. It isn't deallocated, but calling it results in a crash. Typical error messages are:wrong type NSCFSet (expected Proc) (TypeError)wrong type NSRectSet (expected Proc) (TypeError)I'm guessing that there's a pointer to the wrong memory location?Here's the Objective-C implementation:@implementation TestBlock- (id)initWithBlock:(void (^)())aBlock;{[super init];block = [aBlock copy];NSLog(@"Block: %@", block);block();return self;}- (void)callBlock;{NSLog(@"block: %@", block);block();}@endWithin 'initWithBlock:', the copied block can be invoked without error. Attempting to do so from 'callBlock', results in a crash. The test framework can be used without error when using objective-c.Here's the ruby controller code:@b = TestBlock.alloc.initWithBlock Proc.new { puts "hello from ruby"}# this next line is called from a different scope and causes the crash@b.callBlock2010-11-19 08:41:06.620 CallObjectiveCBlocks[7046:a0f] Block: <__NSAutoBlock__: 0x200be74a0>hello from ruby2010-11-19 08:41:20.011 CallObjectiveCBlocks[7046:a0f] block: <__NSAutoBlock__: 0x200be74a0>2010-11-19 08:41:20.012 CallObjectiveCBlocks[7046:a0f] /Users/alan/Documents/programming/macruby/CallObjectiveCBlocks/build/Debug/CallObjectiveCBlocks.app/Contents/Resources/Controller.rb:21:in `call:': wrong type Array (expected Proc) (TypeError)from /Users/alan/Documents/programming/macruby/CallObjectiveCBlocks/build/Debug/CallObjectiveCBlocks.app/Contents/Resources/rb_main.rb:23:in `<main>'
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel