Re: [Pyobjc-dev] Re: [Pyobjc-checkins] [PyObjC-svn] r1605 - in trunk/pyobjc: . Examples/CoreData Exa
Brought to you by:
ronaldoussoren
From: Bob I. <bo...@re...> - 2005-05-01 21:11:41
|
On May 1, 2005, at 4:26 PM, Bill Bumgarner wrote: > On May 1, 2005, at 12:48 PM, ron...@re... wrote: > >> +setSignatureForSelector("NSDocument", "initWithType:error:", >> "@@:@o^@") >> > > Would it be horribly difficult to automatically generate the > correct signature for (NSError **) when generating the wrappers? > > As demonstrated by Core Data, NSError ** style out parameters are > becoming more and more common. > > There is only one twist to them. They aren't totally out > parameters. There needs to be away to specify that NULL should be > passed to the underlying method. This indicates to the API that no > error information should be collected, thus potentially bypassing > expensive operations. > > However, if that parameter is non-NULL, there should NEVER be a > case where the value passed in is used by the underlying API. That > is, the frameworks will always generate a new instance of NSError > and shove the id into the memory pointed to by the parameter. PyObjC doesn't currently have any facility to do this. In/Out and Out types *always* get passed a non-NULL argument. The proper way to work around this would be to do what ctypes does, and have a "pointer" type, so you could say: # id err = nil; # id *errPtr = &err; errPtr = objc_pointer(None, '@') blah.initWithType_error_(typ, errPtr) err = errPtr.value To pass NULL, you would say: blah.initWithType_error_(typ, None) Doing it in this style, we could eliminate nearly all of the special cases for return values and arguments, and make more things possible, but it would be a backwards incompatible change. -bob |