[cfe-commits] r43257 - in /cfe/trunk: Driver/RewriteTest.cpp Lex/Preprocessor.cpp clang.xcodeproj/project.pbxproj include/clang/AST/DeclObjC.h

Chris Lattner clattner at apple.com
Tue Oct 23 17:41:56 PDT 2007


> - Add rewrite rule for @class.
> - Add setter/getter to ObjcClassDecl.
> - Predefined key runtime functions.

Hey Steve,

> +void RewriteTest::RewriteForwardClassDecl(ObjcClassDecl *ClassDecl) {
> +  int numDecls = ClassDecl->getNumForwardDecls();
> +  ObjcInterfaceDecl **ForwardDecls = ClassDecl->getForwardDecls();
> +
> +  // Get the start location and compute the semi location.
> +  SourceLocation startLoc = ClassDecl->getLocation();
> +  const char *startBuf = SM->getCharacterData(startLoc);
> +  const char *semiPtr = startBuf;
> +  while (semiPtr && (*semiPtr != ';')) semiPtr++;

This loop looks equivalent to strchr(semiptr, ';'), except that you  
mean "while (*semiptr && ...".  Please use strchr if possible.

> +  // Translate to typedef's that forward reference structs with  
> the same name
> +  // as the class. As a convenience, we include the original  
> declaration
> +  // as a comment.
> +  std::string typedefString;
> +  typedefString += "// ";
> +  typedefString.append(startBuf, semiPtr-startBuf+1);
> +  typedefString += "\n";

Nice!

> ====================================================================== 
> ========
> --- cfe/trunk/Lex/Preprocessor.cpp (original)
> +++ cfe/trunk/Lex/Preprocessor.cpp Tue Oct 23 15:20:08 2007
> @@ -392,6 +392,23 @@
>      DefineBuiltinMacro(Buf, "NO=(BOOL)0");
>      DefineBuiltinMacro(Buf, "Nil=0");
>      DefineBuiltinMacro(Buf, "nil=0");
> +    ObjcType = "OBJC_EXPORT const char *sel_getName(SEL sel);\n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
> +    ObjcType = "OBJC_EXPORT SEL sel_getUid(const char *str);\n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
> +
> +    // Predefine ObjC primitive functions, traditionally declared in
> +    // <objc/objc-runtime.h>. Unlike the declarations above, we  
> don't protect
> +    // these with a header guard (since multiple identical  
> function declarations
> +    // don't result in an error.
> +    ObjcType = "OBJC_EXPORT id objc_getClass(const char *name);\n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
> +    ObjcType = "OBJC_EXPORT id objc_getMetaClass(const char *name); 
> \n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
> +    ObjcType = "OBJC_EXPORT id objc_msgSend(id self, SEL op, ...); 
> \n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));
> +    ObjcType = "OBJC_EXPORT id objc_msgSendSuper(struct objc_super  
> *super, SEL op, ...);\n";
> +    Buf.insert(Buf.end(), ObjcType, ObjcType+strlen(ObjcType));

This impacts normal objective C code that isn't being 'translated'.   
Are you sure this is the right answer?  It seems better for the  
translator itself to inject decls for these functions if they don't  
exist, instead of unconditionally cramming them into the  
preprocessor.  Unlike "id", these aren't "part of the language".

-Chris





More information about the cfe-commits mailing list