/// property, find the underlying property reference expression.
const ObjCPropertyRefExpr *getObjCProperty() const;
+ /// \brief Check if this expression is the ObjC 'self' implicit parameter.
+ bool isObjCSelfExpr() const;
+
/// \brief Returns whether this expression refers to a vector element.
bool refersToVectorElement() const;
return cast<ObjCPropertyRefExpr>(E);
}
+bool Expr::isObjCSelfExpr() const {
+ const Expr *E = IgnoreParenImpCasts();
+
+ const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
+ if (!DRE)
+ return false;
+
+ const ImplicitParamDecl *Param = dyn_cast<ImplicitParamDecl>(DRE->getDecl());
+ if (!Param)
+ return false;
+
+ const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
+ if (!M)
+ return false;
+
+ return M->getSelfDecl() == Param;
+}
+
FieldDecl *Expr::getBitField() {
Expr *E = this->IgnoreParens();
return PropE->getImplicitPropertyGetter();
}
-static bool isSelfExpr(const Expr *E) {
- E = E->IgnoreParenImpCasts();
-
- const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
- if (!DRE)
- return false;
-
- const ImplicitParamDecl *Param = dyn_cast<ImplicitParamDecl>(DRE->getDecl());
- if (!Param)
- return false;
-
- const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
- if (!M)
- return false;
-
- return M->getSelfDecl() == Param;
-}
-
FunctionScopeInfo::WeakObjectProfileTy::BaseInfoTy
FunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) {
E = E->IgnoreParenCasts();
case Stmt::ObjCIvarRefExprClass: {
const ObjCIvarRefExpr *IE = cast<ObjCIvarRefExpr>(E);
D = IE->getDecl();
- IsExact = isSelfExpr(IE->getBase());
+ IsExact = IE->getBase()->isObjCSelfExpr();
break;
}
case Stmt::PseudoObjectExprClass: {
if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase))
DoubleBase = OVE->getSourceExpr();
- IsExact = isSelfExpr(DoubleBase);
+ IsExact = DoubleBase->isObjCSelfExpr();
}
break;
}
/// Statement visitor, which walks the method body and flags the ivars
/// referenced in it (either directly or via property).
class MethodCrawler : public ConstStmtVisitor<MethodCrawler> {
- const ObjCMethodDecl *EnclosingMethod;
-
/// The set of Ivars which need to be invalidated.
IvarSet &IVars;
void check(const Expr *E);
public:
- MethodCrawler(const ObjCMethodDecl *InMeth,
- IvarSet &InIVars,
+ MethodCrawler(IvarSet &InIVars,
bool &InCalledAnotherInvalidationMethod,
const MethToIvarMapTy &InPropertySetterToIvarMap,
const MethToIvarMapTy &InPropertyGetterToIvarMap,
const PropToIvarMapTy &InPropertyToIvarMap,
ASTContext &InCtx)
- : EnclosingMethod(InMeth),
- IVars(InIVars),
+ : IVars(InIVars),
CalledAnotherInvalidationMethod(InCalledAnotherInvalidationMethod),
PropertySetterToIvarMap(InPropertySetterToIvarMap),
PropertyGetterToIvarMap(InPropertyGetterToIvarMap),
// Check which ivars have been invalidated in the method body.
bool CalledAnotherInvalidationMethod = false;
- MethodCrawler(D, Ivars,
+ MethodCrawler(Ivars,
CalledAnotherInvalidationMethod,
PropSetterToIvarMap,
PropGetterToIvarMap,
// Stop if we are calling '[self invalidate]'.
if (Receiver && isInvalidationMethod(MD))
- if (const DeclRefExpr *RD =
- dyn_cast<DeclRefExpr>(Receiver->IgnoreParenCasts())) {
- if (RD->getDecl() == EnclosingMethod->getSelfDecl()) {
- CalledAnotherInvalidationMethod = true;
- return;
- }
+ if (Receiver->isObjCSelfExpr()) {
+ CalledAnotherInvalidationMethod = true;
+ return;
}
// Check if we call a setter and set the property to 'nil'.