[cfe-dev] Fix for PR4701
David Chisnall
csdavec at swansea.ac.uk
Fri Aug 14 15:47:59 PDT 2009
On 14 Aug 2009, at 23:24, steve naroff wrote:
> From my perspective, depending on the C headers in this fashion is a
> big hack. When Objective-C was born, it wasn't such a big deal
> (since there was only one runtime).
I completely agree. It's a horrible hack, but that doesn't alter the
fact that a large body of existing code that depends on this old
behaviour has accumulated over the last two decades.
> Now that id/Class are more 'builtin', Chris/I decided that
> ObjCIsaExpr worked nicely as a compatibility bridge.
It's fine for id (well, almost; the GNU runtime calls this field
class_pointer, which is horrible but, again, something lots of
existing code depends on). For Class / MetaClass, it's a much bigger
problem.
> I just figured the same approach could be used for your situation.
> At Apple, we've totally moved away from allowing user code to
> directly access the meta-data. In our non-fragile runtime, all the
> same meta-data can be accessed using C functions (so we don't have
> this problem for Class).
>
> Unless you can deprecate some of this stuff (by replacing it with C
> function accessors), I'm afraid anything we do is a hack.
For new code, that's fine. I've written a compatibility framework
that sits on top of the GNU runtime and provides exactly the same
functionality with the same interfaces, but there is still a fair body
of legacy code for both the GNU runtime and the legacy Apple runtime
that directly manipulates the class structures and currently clang
can't compile this code, so some form of hack is required. We also
need to maintain compatibility with GCC in a lot of this code, which
does require these headers for accessing fields on id / Class /
MetaClass. Deprecating it is fine - and I'd be really happy with a
compiler switch that let us error on code that attempted to access
fields other than isa on these types even with when their definitions
are available - but deprecating and removing are two different things.
I've attached an updated version of the diff that fixes all of the
corner cases found by compiling GNUstep's Foundation. It's a hack,
but it's a less-invasive hack than adding a load of new expression
types. I think the ideal solution would be to have a flag on typedef
types that indicated that they can be used as Objective-C message
receivers. I assumed __attribute__((NSObject)) would do this, but it
seems not to. If we had such a flag then we could just use id and
Class typedefs if they were provided with that flag set, which would
provide an even less-invasive hack.
David
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang.diff
Type: application/octet-stream
Size: 10280 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20090814/73a80182/attachment.obj>
-------------- next part --------------
More information about the cfe-dev
mailing list