RetainSummary* getCFSummaryGetRule(FunctionDecl* FD);
RetainSummary* getPersistentSummary(ArgEffects* AE, RetEffect RE);
-
+
+ RetainSummary* getInstanceMethodSummary(Selector S);
+
+ RetainSummary* getMethodSummary(Selector S);
+ RetainSummary* getInitMethodSummary(Selector S);
+
public:
RetainSummaryManager(ASTContext& ctx, bool gcenabled)
// mitigating the need to do explicit cleanup of the
// Argument-Effect summaries.
- for (ArgEffectsSetTy::iterator I = ArgEffectsSet.begin(), E = ArgEffectsSet.end(); I!=E; ++I)
+ for (ArgEffectsSetTy::iterator I = ArgEffectsSet.begin(),
+ E = ArgEffectsSet.end(); I!=E; ++I)
I->getValue().~ArgEffects();
}
//===----------------------------------------------------------------------===//
RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD,
- ASTContext& Ctx) {
+ ASTContext& Ctx) {
SourceLocation Loc = FD->getLocation();
}
RetainSummary* RetainSummaryManager::getNSSummary(FunctionDecl* FD,
- const char* FName) {
+ const char* FName) {
FName += 2;
if (strcmp(FName, "MakeCollectable") == 0)
}
RetainSummary* RetainSummaryManager::getCFSummary(FunctionDecl* FD,
- const char* FName) {
+ const char* FName) {
FName += 2;
// Summary creation for Selectors.
//===----------------------------------------------------------------------===//
+RetainSummary* RetainSummaryManager::getInitMethodSummary(Selector S) {
+ assert(ScratchArgs.empty());
+
+ RetainSummary* Summ =
+ getPersistentSummary(getArgEffects(), RetEffect::MakeReceiverAlias());
+
+ ObjCMethodSummaries[S] = Summ;
+ return Summ;
+}
+
+RetainSummary* RetainSummaryManager::getMethodSummary(Selector S) {
+
+ // Look up a summary in our cache of Selectors -> Summaries.
+ ObjCMethodSummariesTy::iterator I = ObjCMethodSummaries.find(S);
+
+ if (I != ObjCMethodSummaries.end())
+ return I->second;
+ // "initXXX": pass-through for receiver.
+ const char* s = S.getIdentifierInfoForSlot(0)->getName();
+
+ if (s[0] == 'i' && s[10] == 'n' && s[2] == 'i' && s[3] == 't')
+ return getInitMethodSummary(S);
+
+ return 0;
+}
+
+RetainSummary* RetainSummaryManager::getInstanceMethodSummary(Selector S) {
+
+ // Look up a summary in our cache of Selectors -> Summaries.
+ ObjCMethodSummariesTy::iterator I = ObjCInstanceMethodSummaries.find(S);
+
+ if (I != ObjCInstanceMethodSummaries.end())
+ return I->second;
+
+ return 0;
+}
//===----------------------------------------------------------------------===//
// Reference-counting logic (typestate + counts).