I'm currently working with an API that sends me a memory address for an int and expects me to populate it with a value: It essentially looks like this: int retValue = 1; [historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mUpdate from GitX", [ref ref], [dropCommit realSha], NULL] retValue:&retValue]; if (retValue) return NO; I am writing code that implements outputForArguments:retValue:, but it seems that MacRuby hands me an opaque primitive that I can't use. When I try to do anything with it, I get EXC_BAD_ACCESS. Any ideas? Yehuda Katz Developer | Engine Yard (ph) 718.877.1325
Hi Yehuda, C pointers are mapped to the Pointer class. You can create Pointer objects by yourself, and if you override an Objective-C method with a C pointer argument, MacRuby will hand you an instance of Pointer. You code could be rewritten in MacRuby as: retValuePtr = Pointer.new(:int) # this creates a C pointer of sizeof (int) of 1 element retValuePtr[0] = 1 # assigns 1 as the first (and only) element of the pointer historyController.repository outputForArguments:['update-ref', '- mUpdate from GitX', ref.ref, dropCommit.realSha], retValue: retValuePtr if retValuePtr[0] == 1 # dereference the first element of the pointer return false end # ... If you are overriding the outputForArguments:retValue: method in MacRuby, the last argument should be of Pointer type. def outputForArguments(args, retValue: retValuePtr) # ... if some_error retValuePtr[0] = 1 end end It is very easily to crash the program while using a Pointer object that was created by MacRuby, because MacRuby has no way to know the boundaries of the original C pointer. Laurent On Dec 4, 2009, at 4:16 PM, Yehuda Katz wrote:
I'm currently working with an API that sends me a memory address for an int and expects me to populate it with a value:
It essentially looks like this:
int retValue = 1; [historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mUpdate from GitX", [ref ref], [dropCommit realSha], NULL] retValue:&retValue]; if (retValue) return NO;
I am writing code that implements outputForArguments:retValue:, but it seems that MacRuby hands me an opaque primitive that I can't use. When I try to do anything with it, I get EXC_BAD_ACCESS.
Any ideas?
Yehuda Katz Developer | Engine Yard (ph) 718.877.1325 _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
participants (2)
-
Laurent Sansonetti
-
Yehuda Katz