[cfe-dev] Objective-C tidy up

Chris Lattner clattner at apple.com
Thu Jun 5 23:36:27 PDT 2008

On Jun 5, 2008, at 8:26 AM, David Chisnall wrote:

> On 4 Jun 2008, at 18:11, Chris Lattner wrote:
>>> Any function in Objective-C can use self and _cmd as identifier
>>> names.  Any occurrence of the 'this' token in a C++ program refers
>>> to an instance of an object with a type defined by the context.
>> Does 'super' in ObjC work the same way?
> Yes.  Objective-C is a pure superset of C, so anything that is valid  
> C is valid Objective-C.  Which means my current handling of super is  
> wrong...
> I'm not sure the best way to handle this, since super has very  
> specific semantics in Objective-C (it is only valid as the receiver  
> for messages) and so can't just have a phantom decl added.   
> Suggestions welcome...

Ok.  I think we converged on this.  the parsing code is nearly right  
for super (please check in your fix) and modeling it as predefined  
expr is great.

>>> So, the question is not what should occurrences of the self and _cmd
>>> tokens be turned into (although that might be a separate question),
>>> it's what the entries in the decl map should be populated with.  As
>>> far as my code goes, this can be pretty much any sort of decl.  It
>>> needs to have a type associated with it for Sema to be able to be
>>> able to do type checking (for self, this is a pointer to an instance
>>> of the current class, e.g. NSObject*, for _cmd it is SEL).  For
>>> CodeGen, it needs to have a name.
>> Gotcha.  What do you think of a new subclass of ValueDecl?
> Do we need a new subclass?  I'm not actually sure what this needs  
> that a ValueDecl doesn't provide, so we could possibly just use a  
> ValueDecl.

If that works, please go for it.  Please add a big comment above te  
ValueDecl class indicating that ObjC uses it this way though.

>> It would be really nice to lazily allocate these objects when they  
>> are
>> first used.  This would allow us to avoid allocating the _cmd decl  
>> for
>> almost every ObjC method, and avoid 'self' on many of them.
> That would be ideal.  I'm not sure where the best place to put it  
> would be.  Ideally I would want failed lookups in the decl map to  
> insert it, but I think a few places access the decl map.  One other  
> option would be to allocate the self decl on a per-class basis  
> (since it's the same for every method in a class - a pointer to an  
> instance of that class) and the _cmd once per module.  It would  
> probably easier to allocate them both once per class.

Take a look at how name lookup is currently working and how builtins  
are lazily created, you should be able to do something similar.

> It is very rare to have a class which does not contain at least one  
> reference to self.  Most classes will override -init, and the common  
> pattern for this is to start the method with:
> if (nil == (self = [self init])) return nil;

Sure, but we'd need to make one decl for self in *every method* that  
references it, not once per class.

> References to _cmd are less common - they are generally only used  
> for message forwarding (which tends to only be done in a root class)  
> or for debugging.


> [1] These should probably have a common superclass, since they are  
> almost identical - in fact an ObjCImplementationDecl could inherit  
> from ObjCCategoryImplDecl, since a class is effectively a category  
> which is allowed to declare instance variables.

I think it would be great to unify some of this stuff.  There is a lot  
of awkward code in the objc front-end for groking this stuff that  
should be unified, but I haven't figured out how.  Suggestions  
welcome :)


More information about the cfe-dev mailing list