I see.
It would be ideal if you could provide a small test sample, so that we can
reproduce the bug :-)
--
Thibault Martin-Lagardette
On Nov 19, 2010, at 12:25, 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.
>
> Al
>
> On 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();
>>> }
>>>
>>> @end
>>>
>>>
>>> Within '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.callBlock
>>>
>>>
>>> 2010-11-19 08:41:06.620 CallObjectiveCBlocks[7046:a0f] Block:
>>> <__NSAutoBlock__: 0x200be74a0>
>>> hello from ruby
>>>
>>> 2010-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
>>> [email protected]
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>
>> _______________________________________________
>> MacRuby-devel mailing list
>> [email protected]
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
> _______________________________________________
> MacRuby-devel mailing list
> [email protected]
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel