|
From: | Fred Kiefer |
Subject: | Re: another exception triggered by OGo in gnustep-base |
Date: | Fri, 29 Jul 2011 23:32:25 +0200 |
User-agent: | Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.18) Gecko/20110616 SUSE/3.1.11 Thunderbird/3.1.11 |
On 29.07.2011 19:25, Sebastian Reitenbach wrote:
On Friday, July 29, 2011 15:26 CEST, "Sebastian Reitenbach"<sebastia@l00-bugdead-prods.de> wrote:On Friday, July 29, 2011 15:00 CEST, David Chisnall<theraven@sucs.org> wrote:On 29 Jul 2011, at 13:51, Sebastian Reitenbach wrote:I found this documentation here: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.htmlInitializes a newly allocated data object by adding to it length >>>>
bytes of data from the buffer bytes.
but it doesn't state that a subclass should implement it??? SkyDecodeWrapperData is a subclass of NSData, so I should implement that method there?I think this is a GNUstep bug. The default implementation o initWithBytesNoCopy:length:freeWhenDone: should probably be releasing self and returning a new instance of the class that does support this initialiser (as happens in the placeholder data class).While fiddling around there, I found that NSDataMalloc implements initWithBytesNoCopy:length:freeWhenDone:, and I looked at it how it is done there, and implemented it similarly in OGos SkyDecodeWrapperData, which now works like a charm ;)
I think both OGo and libFoundation where wrong here. The method -initWithBytesNoCopy:length:freeWhenDone: is the designated initializer of the class NSData, although this isn't stated in the Apple documentation, but the initializer with the most arguments takes over this role and all other initializers should call this method.
libFoundation tried to implement that method with other initializers, which is just wrong. And OGO forgot to implement that method in their own subclass. Anyway, from your back trace it looks like the class [SkyDecodeWrapperData -initWithData:encoding:] calls [NSData -init], perhaps as a super call, this also looks wrong to me. although it normally wont do much harm.
[Prev in Thread] | Current Thread | [Next in Thread] |