[cfe-commits] r150844 - /cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
Fariborz Jahanian
fjahanian at apple.com
Fri Feb 17 14:20:12 PST 2012
Author: fjahanian
Date: Fri Feb 17 16:20:12 2012
New Revision: 150844
URL: http://llvm.org/viewvc/llvm-project?rev=150844&view=rev
Log:
modern objc translator: postpone writing of class definitions
until the end when all their ivars are known then.
Modified:
cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp?rev=150844&r1=150843&r2=150844&view=diff
==============================================================================
--- cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp (original)
+++ cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Fri Feb 17 16:20:12 2012
@@ -107,7 +107,8 @@
SmallVector<ObjCCategoryImplDecl *, 8> CategoryImplementation;
llvm::SmallPtrSet<ObjCInterfaceDecl*, 8> ObjCSynthesizedStructs;
llvm::SmallPtrSet<ObjCProtocolDecl*, 8> ObjCSynthesizedProtocols;
- llvm::SmallPtrSet<ObjCInterfaceDecl*, 8> ObjCForwardDecls;
+ llvm::SmallPtrSet<ObjCInterfaceDecl*, 8> ObjCWrittenInterfaces;
+ SmallVector<ObjCInterfaceDecl*, 32> ObjCInterfacesSeen;
SmallVector<Stmt *, 32> Stmts;
SmallVector<int, 8> ObjCBcLabelNo;
// Remember all the @protocol(<expr>) expressions.
@@ -168,6 +169,10 @@
if (!Class->isThisDeclarationADefinition()) {
RewriteForwardClassDecl(D);
break;
+ } else {
+ // Keep track of all interface declarations seen.
+ ObjCInterfacesSeen.push_back(Class->getCanonicalDecl());
+ break;
}
}
@@ -1191,7 +1196,7 @@
SuperClass = SuperClass->getSuperClass();
}
std::string ResultStr;
- if (!ObjCForwardDecls.count(ClassDecl->getCanonicalDecl())) {
+ if (!ObjCWrittenInterfaces.count(ClassDecl->getCanonicalDecl())) {
// we haven't seen a forward decl - generate a typedef.
ResultStr = "#ifndef _REWRITER_typedef_";
ResultStr += ClassDecl->getNameAsString();
@@ -1203,8 +1208,8 @@
ResultStr += ClassDecl->getNameAsString();
ResultStr += ";\n#endif\n";
RewriteObjCInternalStruct(ClassDecl, ResultStr);
- // Mark this typedef as having been generated.
- ObjCForwardDecls.insert(ClassDecl->getCanonicalDecl());
+ // Mark this typedef as having been written into its c++ equivalent.
+ ObjCWrittenInterfaces.insert(ClassDecl->getCanonicalDecl());
for (ObjCInterfaceDecl::prop_iterator I = ClassDecl->prop_begin(),
E = ClassDecl->prop_end(); I != E; ++I)
@@ -3201,6 +3206,16 @@
/// and emits meta-data.
void RewriteModernObjC::RewriteImplementations() {
+
+ for (unsigned i = 0, e = ObjCInterfacesSeen.size(); i < e; i++) {
+ ObjCInterfaceDecl *CDecl = ObjCInterfacesSeen[i];
+ // Write struct declaration for the class matching its ivar declarations.
+ // Note that for modern abi, this is postponed until the end of TU
+ // because class extensions and the implementation might declare their own
+ // private ivars.
+ RewriteInterfaceDecl(CDecl);
+ }
+
int ClsDefCount = ClassImplementation.size();
int CatDefCount = CategoryImplementation.size();
@@ -3209,13 +3224,8 @@
ObjCImplementationDecl *OIMP = ClassImplementation[i];
ObjCInterfaceDecl *CDecl = OIMP->getClassInterface();
if (CDecl->isImplicitInterfaceDecl())
- assert(false &&
- "Legacy implicit interface rewriting not supported in moder abi");
- // Write struct declaration for the class matching its ivar declarations.
- // Note that for modern abi, this is postponed until implementation decl.
- // because class extensions and the implementation might declare their own
- // private ivars.
- RewriteInterfaceDecl(CDecl);
+ assert(false &&
+ "Legacy implicit interface rewriting not supported in moder abi");
RewriteImplementationDecl(OIMP);
}
@@ -3225,11 +3235,6 @@
if (CDecl->isImplicitInterfaceDecl())
assert(false &&
"Legacy implicit interface rewriting not supported in moder abi");
- // Write struct declaration for the class matching its ivar declarations.
- // Note that for modern abi, this is postponed until implementation decl.
- // because class extensions and the implementation might declare their own
- // private ivars.
- RewriteInterfaceDecl(CDecl);
RewriteImplementationDecl(CIMP);
}
}
More information about the cfe-commits
mailing list