aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CFRefCount.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/CFRefCount.cpp')
-rw-r--r--lib/Analysis/CFRefCount.cpp47
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*