<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On May 19, 2009, at 8:05 PM, David Chisnall wrote:</div><blockquote type="cite"><div><br>On 20 May 2009, at 00:50, Fariborz Jahanian wrote:<br><br><blockquote type="cite">I am not sure if any want want to do this. But following code is  <br></blockquote><blockquote type="cite">legal:<br></blockquote><blockquote type="cite">#include <objc/objc.h><br></blockquote><blockquote type="cite">id pi;<br></blockquote><blockquote type="cite">Class min()<br></blockquote><blockquote type="cite">{<br></blockquote><blockquote type="cite">  return pi->isa;<br></blockquote><blockquote type="cite">}<br></blockquote><br>This is a much more common idiom.  Ideally, however, we would be  <br>treating this as an ivar access with a known offset of 0, rather than  <br>as a structure field access.  This probably ought to generate the same  <br>code irrespective of whether pi is an id, an NSObject* or an Object*  <br>(although it should give a warning / error on NSObject where isa is  <br>declared @protected).  Perhaps we should be declaring an implicit  <br>Class isa as an ivar on any ObjCIdType, so ObjCIdType defines a  <br>pointer to an object with a single ivar which accepts all messages.<br><br></div></blockquote><div><br></div><div>This sounds good to me. </div><div><br></div><div>Consider the following pseudo code (for discussion...not meant to be complete):</div><div><br></div></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">@class Class, Protocol;</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">@interface id // ObjCIdType: The implicit root of all ObjC objects.</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">{</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">  Class isa;</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">}</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">// All ObjC roots will inherit the following class methods.</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">// This will greatly simplify defining an ObjC root class.</span></font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">+ (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">Class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">+ (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">Class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)superclass;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">+ (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">BOOL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)instancesRespondToSelector:(</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">SEL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)aSelector;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">+ (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">BOOL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)conformsToProtocol:(Protocol *)protocol;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">+ (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">IMP</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)instanceMethodForSelector:(</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">SEL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)aSelector;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">- (</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">BOOL</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)isKindOfClass:(</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">Class</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)aClass;</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">- (</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">BOOL</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)isMemberOfClass:(</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">Class</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)aClass;</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">- (</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">BOOL</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)conformsToProtocol:(Protocol *)aProtocol;</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">- (</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">BOOL</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)respondsToSelector:(</span></font><span style=""><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">SEL</span></font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4"><span class="Apple-style-span" style="background-color: transparent; font-size: 14px;">)aSelector;</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="font-family: Courier; font-size: 14px; ">@end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">@interface Class // ObjCClassType: Will implicitly inherit from 'id'</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">// No explicit ivar declarations, the structure of 'Class' is intentionally opaque (since the details are runtime specific).</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">- (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">Class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">;</font></div></span></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">- (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">Class</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)superclass;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">- (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">BOOL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)instancesRespondToSelector:(</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">SEL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)aSelector;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">- (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">BOOL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)conformsToProtocol:(Protocol *)protocol;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#000000" face="Courier" size="4">- (</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">IMP</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)instanceMethodForSelector:(</font><span><font class="Apple-style-span" color="#000000" face="Courier" size="4">SEL</font></span><font class="Apple-style-span" color="#000000" face="Courier" size="4">)aSelector;</font></div><div><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div></span></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;">@end</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; ">Conceptually, I like this...it makes some of the current legacy C 'magic' much more explicit.</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Courier" size="4"><span class="Apple-style-span" style="font-size: 14px;"><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "><div><br></div><div>It does, however, require another bit of magic. Since the current definition of 'id' and 'Class' include a pointer, we will have to treat this specially (and not require an explicit '*' as we do for user-defined classes). Shouldn't be a big deal, however wanted to mention it. One day, maybe we can make the '*' implicit for user-defined classes:-)</div><div><br></div><div>The other issue is source compatibility with existing root classes (that explicitly declare an 'isa', for example). This could be handled in many ways...not worth talking about until we agree on the concept/direction.</div><div><br></div><div>What do you think?</div><div><br></div><div>snaroff</div><div><br></div></span></span></font></div><div><font class="Apple-style-span" face="Monaco" size="2"><span class="Apple-style-span" style="font-size: 10px;"><br></span></font></div></div><div><blockquote type="cite"><div>David<br>_______________________________________________<br>cfe-dev mailing list<br><a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev<br></div></blockquote></div><br></body></html>