diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-03-22 18:25:57 +0000 | 
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-03-22 18:25:57 +0000 | 
| commit | d2ae2d0a2a88546548d40af5793c327d90bf6436 (patch) | |
| tree | 7b3ce441735051c6ae143a463eebe9d2b7e7a86f /clang | |
| parent | c286c88db0c63a815f72bcfeff93b0c93830f2c1 (diff) | |
| download | bcm5719-llvm-d2ae2d0a2a88546548d40af5793c327d90bf6436.tar.gz bcm5719-llvm-d2ae2d0a2a88546548d40af5793c327d90bf6436.zip  | |
More clean up of ivars which are either in class extensions and
implementation or synthesized into an implementation. Also,
fixes a code gen. bug when ivars are itroduced in interleaved
implementations. (related to radar 7547942).
llvm-svn: 99193
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/ASTContext.h | 3 | ||||
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 42 | 
2 files changed, 16 insertions, 29 deletions
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index e77dcf86cca..4c163611ac4 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -937,8 +937,7 @@ public:                                 llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars);    void CollectNonClassIvars(const ObjCInterfaceDecl *OI,                                 llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars); -  unsigned CountSynthesizedIvars(const ObjCInterfaceDecl *OI); -  unsigned CountProtocolSynthesizedIvars(const ObjCProtocolDecl *PD); +  unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI);    void CollectInheritedProtocols(const Decl *CDecl,                            llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols); diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 7f5c9b1ec1e..fcc3e3d0c23 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -858,34 +858,22 @@ void ASTContext::CollectInheritedProtocols(const Decl *CDecl,    }  } -unsigned ASTContext::CountProtocolSynthesizedIvars(const ObjCProtocolDecl *PD) { -  unsigned count = 0; -  for (ObjCContainerDecl::prop_iterator I = PD->prop_begin(), -       E = PD->prop_end(); I != E; ++I) -    if ((*I)->getPropertyIvarDecl()) -      ++count; - -  // Also look into nested protocols. -  for (ObjCProtocolDecl::protocol_iterator P = PD->protocol_begin(), -       E = PD->protocol_end(); P != E; ++P) -    count += CountProtocolSynthesizedIvars(*P); -  return count; -} - -unsigned ASTContext::CountSynthesizedIvars(const ObjCInterfaceDecl *OI) { -  unsigned count = 0; -  for (ObjCInterfaceDecl::prop_iterator I = OI->prop_begin(), -       E = OI->prop_end(); I != E; ++I) { -    if ((*I)->getPropertyIvarDecl()) +unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) { +  unsigned count = 0;   +  // Count ivars declared in class extension. +  if (const ObjCCategoryDecl *CDecl = OI->getClassExtension()) { +    for (ObjCCategoryDecl::ivar_iterator I = CDecl->ivar_begin(), +         E = CDecl->ivar_end(); I != E; ++I) {        ++count; +    }    } -  // Also look into interface's protocol list for properties declared -  // in the protocol and whose ivars are synthesized. -  for (ObjCInterfaceDecl::protocol_iterator P = OI->protocol_begin(), -       PE = OI->protocol_end(); P != PE; ++P) { -    ObjCProtocolDecl *PD = (*P); -    count += CountProtocolSynthesizedIvars(PD); -  } +   +  // Count ivar defined in this class's implementation.  This +  // includes synthesized ivars. +  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) +    for (ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(), +         E = ImplDecl->ivar_end(); I != E; ++I) +      ++count;    return count;  } @@ -966,7 +954,7 @@ ASTContext::getObjCLayout(const ObjCInterfaceDecl *D,    // Add in synthesized ivar count if laying out an implementation.    if (Impl) { -    unsigned SynthCount = CountSynthesizedIvars(D); +    unsigned SynthCount = CountNonClassIvars(D);      // If there aren't any sythesized ivars then reuse the interface      // entry. Note we can't cache this because we simply free all      // entries later; however we shouldn't look up implementations  | 

