Hey Stefan
On 2011-04-26, at 8:45 PM, Stefan Bidi wrote:
> On Tue, Apr 26, 2011 at 9:17 PM, Eric Wasylishen <[email protected]>
> wrote:
> Hey.
> -[NSNumberFormatter init] has this block of code:
>
> internal->_behavior = _defaultBehavior;
> internal->_locale = RETAIN([NSLocale currentLocale]);
> internal->_style = NSNumberFormatterNoStyle;
> internal->_symbols = NSZoneCalloc (z, MAX_SYMBOLS, sizeof(id));
> internal->_textAttributes = NSZoneCalloc (z, MAX_TEXTATTRIBUTES, sizeof(id));
> internal->_attributes = NSZoneCalloc (z, MAX_ATTRIBUTES, sizeof(int));
>
> which allocates some C arrays. However, these ivars are never initialized if
> you use -initWithCoder:, and so if you call -setDecimalSeparator: on a
> instance loaded from a nib, you'll get a segfault in this line of code in the
> SET_SYMBOL macro:
>
> if (internal->_symbols[key])
>
> since the internal->_symbols will be NULL at that point.
>
> Thanks for spotting that. I seem to have forgotten about the NSCoding
> protocol when I added these new ivars. I see where someone (can't remember
> if it was me or not) added a FIXME tag in -initWithCoder:.
>
> I have a couple of comments about this:
>
> 1. The SET_SYMBOL macro wasted me a significant amount of time because I had
> to expand it by hand to locate the segfault. Is there a reason this isn't a
> private instance method instead of a macro? (same with SET_TEXTATTRIBUTE,
> SET_ATTRIBUTE, SET_BOOL, GET_SYMBOL, GET_ATTRIBUTE, GET_BOOL).
> Sorry to sound negative; the new NSNumberFormatter implementation looks
> really nice otherwise :-)
>
> I don't have a good reason as to why I did it. I originally used methods but
> later changed it to macros.
>
I see. I didn't mean to direct my annoyance at you, but at GDB for not letting
you step line by line though macro definitons :-)
I guess it's probably not worth the effort changing these back to methods - the
bug wasn't in the macro definitions, anyway.
> 2. I've seen this mistake (-initWithCoder not doing everything -init does)
> before, and I expect it occurs elsewhere in GNUstep. Do we have a policy on
> how to prevent this from happening in the future? i.e. what's the right way
> to implement -initWithCoder and -init? I think we should have a standard
> pattern we use everywhere.
>
> I'm OK with this or the private method you mentioned in your other e-mail. I
> can't promise I'll get to it right away, though... I haven't had a lot of
> personal time lately.
>
No worries, I committed a fix already so -initWithCoder: works. (using a
private method like I described). I'd be interested to hear what others think
about adopting an approach similar to this for other classes that implement
NSCoding.
Regards,
Eric
_______________________________________________
Gnustep-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnustep-dev