[MacRuby] #1003: Copied Proc objects cause crash when used as Objective-C blocks
MacRuby
ruby-noreply at macosforge.org
Fri Nov 19 07:08:16 PST 2010
#1003: Copied Proc objects cause crash when used as Objective-C blocks
----------------------------------+-----------------------------------------
Reporter: al_skipp@… | Owner: lsansonetti@…
Type: defect | Status: new
Priority: blocker | Milestone:
Component: MacRuby | Keywords:
----------------------------------+-----------------------------------------
Objective-C objects which copy a C block to invoke later can cause a
crash/error when used in macruby.
The Objective-C code is as follows (also attached as a framework):
{{{
#import <Cocoa/Cocoa.h>
@interface TestBlock : NSObject {
void (^block)(void);
}
- (id)initWithBlock:(void (^)())aBlock;
- (void)callBlock;
@end
#import "TestBlock.h"
@implementation TestBlock
- (id)initWithBlock:(void (^)())aBlock;
{
if ((self = [super init])) {
block = [aBlock copy];
NSLog(@"Block: %@", block);
block();
}
return self;
}
- (void)callBlock;
{
NSLog(@"block: %@", block);
block();
}
@end
}}}
The following code will work if saved in an .rb file and called from
Macruby. However the same code in Macirb will fail.
{{{
framework File.expand_path('BlockFrameworkTest.framework')
b = TestBlock.alloc.initWithBlock Proc.new { puts "hello"}
b.callBlock
}}}
Also included is a small Xcode project that shows that the code fails when
invoked from macruby, but not from objective-c.
My guess is that when the object is initialized and the 'callBlock' method
are invoked within the same iteration of the run loop, then the error
doesn't occur. If the 'callBlock' method call occurs in a later run loop
iteration, the error will occur. But that's a guess.
--
Ticket URL: <http://www.macruby.org/trac/ticket/1003>
MacRuby <http://macruby.org/>
More information about the macruby-tickets
mailing list