[objc-improvements] RFC: Message passing prototype search cleanup
David Ayers
d.ayers@inode.at
Sat Sep 6 10:05:00 GMT 2003
Alexander Malmberg wrote:
>>Before we started messing with things, the compiler would actually pick
>>the _last_ prototype
>>seen, since it simply reached into the appropriate bucket in the hash
>>table (and we prepend
>>things to buckets rather than appending them). Has this been changed?
>>
>>
>
>This comment applies when searching for a prototype for a known receiver
>type. In that case, we used, and still use, the first prototype found in
>the sortof "derived-most" search that lookup_method_static() et al do.
>
>Currently, I consider this order to be somewhat implementation defined,
>but if we wanted to, we could document it and fixate it so that users
>may safely rely on it.
>
>This would give users a nice set of options. Those who want warnings
>about conflicts and don't want to worry about the search order can
>enable the warning, and those who don't want warnings can disable the
>warnings and safely rely on a defined search order.
>
>For reference, the search order (both before and after my patch) is:
>
>1. Interface of the class.
>for each category (in a "random" order):
> 2. The interface of that category.
> 3. The protocols (recursively, depth first) of that category.
>4. The protocols (recursively, depth first) of the main interface.
>5. (1) through (4) for each superclass.
>6. The local @implementation.
>7. Protocols specified in the type (recursively, depth first).
>
>Before fixating this, I suggest that we move 4. up right below 1. for
>consistency. Also, we might want to consider checking categories before
>we check the main interface, since this is what the runtime will do.
>
>
I think you're making a very important point here. We should definitely
match up any sequence as best as we can to the runtime behavior. My
current worry is that the class interface is used before the category.
As the interface must always be included before any categories, this
will effectively ignore any category declarations. Yet the runtime will
definitely use one of the category implemtations (eventhough which one
exactly, is undefined).
So on the one hand, I would argue to move category processing before the
interface. On the other hand, changing the prototype in a category
seems kind of broken anyway and haveing a rand... oops, I mean a
'declaration order defined' selection as the primary entry point seems
shaky. Then again, it reflects the shakyness of the runtime behavior,
and it's only shaky in the case of multiple categories for the same
selector.
But let's take an example: -compare: :-) If I dislike the semantics of
-compare: that preclude that receiver and argument must be of a similar
class, and I implement a category which allows (id) as an argument, I
would want the compiler to use my categories prototype rather than the
typed prototype of the interface declaration. I think this is a valid
scenario of overriding the prototype (independent of the new semantics,
which could just be raising an exception, before trying to access ivars
of the argument to prevent segfaults).
Cheers,
David Ayers
More information about the Gcc-patches
mailing list