diff options
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 07dbf10c40..ca420006d2 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -779,8 +779,8 @@ public: RetainSummary* getCommonMethodSummary(const ObjCMethodDecl* MD, Selector S, QualType RetTy); - void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, unsigned i, - const ParmVarDecl *PD); + void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, const Decl *D, + unsigned argIdx = 0); void updateSummaryFromAnnotations(RetainSummary &Summ, const ObjCMethodDecl *MD); @@ -1097,22 +1097,32 @@ RetainSummaryManager::getInitMethodSummary(QualType RetTy) { // 'init' methods only return an alias if the return type is a location type. return getPersistentSummary(Loc::IsLocType(RetTy) ? RetEffect::MakeReceiverAlias() - : RetEffect::MakeNoRet()); + : RetEffect::MakeNoRet()); } - void RetainSummaryManager::updateSummaryArgEffFromAnnotations(RetainSummary &Summ, - unsigned i, - const ParmVarDecl *PD){ - if (PD->getAttr<NSOwnershipRetainAttr>()) - Summ.setArgEffect(AF, i, IncRefMsg); - else if (PD->getAttr<CFOwnershipRetainAttr>()) - Summ.setArgEffect(AF, i, IncRef); - else if (PD->getAttr<NSOwnershipReleaseAttr>()) - Summ.setArgEffect(AF, i, DecRefMsg); - else if (PD->getAttr<CFOwnershipReleaseAttr>()) - Summ.setArgEffect(AF, i, DecRef); + const Decl *D, + unsigned i) { + ArgEffect E = DoNothing; + + if (D->getAttr<NSOwnershipRetainAttr>()) + E = IncRefMsg; + else if (D->getAttr<CFOwnershipRetainAttr>()) + E = IncRef; + else if (D->getAttr<NSOwnershipReleaseAttr>()) + E = DecRefMsg; + else if (D->getAttr<CFOwnershipReleaseAttr>()) + E = DecRef; + else if (D->getAttr<NSOwnershipAutoreleaseAttr>()) + E = Autorelease; + else + return; + + if (isa<ParmVarDecl>(D)) + Summ.setArgEffect(AF, i, E); + else + Summ.setReceiverEffect(E); } void @@ -1137,7 +1147,7 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, unsigned i = 0; for (FunctionDecl::param_const_iterator I = FD->param_begin(), E = FD->param_end(); I != E; ++I, ++i) - updateSummaryArgEffFromAnnotations(Summ, i, *I); + updateSummaryArgEffFromAnnotations(Summ, *I, i); } void @@ -1162,13 +1172,10 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, unsigned i = 0; for (ObjCMethodDecl::param_iterator I = MD->param_begin(), E = MD->param_end(); I != E; ++I, ++i) - updateSummaryArgEffFromAnnotations(Summ, i, *I); + updateSummaryArgEffFromAnnotations(Summ, *I, i); // Determine any effects on the receiver. - if (MD->getAttr<NSOwnershipRetainAttr>()) - Summ.setReceiverEffect(IncRefMsg); - else if (MD->getAttr<NSOwnershipReleaseAttr>()) - Summ.setReceiverEffect(DecRefMsg); + updateSummaryArgEffFromAnnotations(Summ, MD); } RetainSummary* |