From ae0ec1d09fd68828adc5f0bb0186e4e15c6a8589 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 6 Oct 2007 20:08:36 +0000 Subject: [PATCH] simplify the interface to create ObjcClassDecl's. llvm-svn: 42706 --- clang/Sema/SemaDecl.cpp | 16 ++++++++-------- clang/include/clang/AST/DeclObjC.h | 14 ++++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index 5916f4cccbed..71ba023dcf08 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -1372,12 +1372,11 @@ Action::DeclTy * Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc, IdentifierInfo **IdentList, unsigned NumElts) { - ObjcClassDecl *CDecl = new ObjcClassDecl(AtClassLoc, NumElts); - + llvm::SmallVector Interfaces; + for (unsigned i = 0; i != NumElts; ++i) { - ObjcInterfaceDecl *IDecl; - IDecl = getObjCInterfaceDecl(IdentList[i]); - if (!IDecl) {// Already seen? + ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(IdentList[i]); + if (!IDecl) { // Not already seen? Make a forward decl. IDecl = new ObjcInterfaceDecl(SourceLocation(), 0, IdentList[i], true); // Chain & install the interface decl into the identifier. IDecl->setNext(IdentList[i]->getFETokenInfo()); @@ -1385,10 +1384,11 @@ Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc, } // Remember that this needs to be removed when the scope is popped. S->AddDecl(IdentList[i]); - - CDecl->setInterfaceDecl((int)i, IDecl); + + Interfaces.push_back(IDecl); } - return CDecl; + + return new ObjcClassDecl(AtClassLoc, &Interfaces[0], Interfaces.size()); } diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 0f4e8d76b50d..17b7adc00a39 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -351,19 +351,21 @@ public: /// @class NSCursor, NSImage, NSPasteboard, NSWindow; /// class ObjcClassDecl : public TypeDecl { - ObjcInterfaceDecl **ForwardDecls; // Null if not defined. - int NumForwardDecls; // -1 if not defined. + ObjcInterfaceDecl **ForwardDecls; + unsigned NumForwardDecls; public: - ObjcClassDecl(SourceLocation L, unsigned nElts) + ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts) : TypeDecl(ObjcClass, L, 0, 0) { if (nElts) { ForwardDecls = new ObjcInterfaceDecl*[nElts]; - memset(ForwardDecls, '\0', nElts*sizeof(ObjcInterfaceDecl*)); + memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*)); + } else { + ForwardDecls = 0; } NumForwardDecls = nElts; } - void setInterfaceDecl(int idx, ObjcInterfaceDecl *OID) { - assert((idx < NumForwardDecls) && "index out of range"); + void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) { + assert(idx < NumForwardDecls && "index out of range"); ForwardDecls[idx] = OID; } static bool classof(const Decl *D) {