More support for rewriting property getter/setters.

llvm-svn: 60450
This commit is contained in:
Steve Naroff 2008-12-03 00:56:33 +00:00
parent b43a689520
commit f326f4056e
1 changed files with 44 additions and 1 deletions

View File

@ -104,6 +104,9 @@ namespace {
llvm::DenseMap<BlockExpr *, std::string> RewrittenBlockExprs;
// This maps a synthesized message expr back to the original property.
llvm::DenseMap<Stmt *, ObjCPropertyRefExpr *> PropMsgExprs;
FunctionDecl *CurFunctionDef;
VarDecl *GlobalVarDecl;
@ -193,6 +196,8 @@ namespace {
Stmt *RewriteFunctionBodyOrGlobalInitializer(Stmt *S);
Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
Stmt *RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV, SourceLocation OrigStart);
Stmt *RewritePropertyRefExpr(ObjCPropertyRefExpr *PropRefExpr);
Stmt *RewritePropertySetter(BinaryOperator *BinOp, ObjCPropertyRefExpr *PRE);
Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp);
Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp);
@ -650,7 +655,7 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
// Synthesize an explicit cast to initialize the ivar.
// FIXME: deal with code generation implications for various property
// attributes (copy, retain, nonatomic).
// See objc-act.c:objc_synthesize_new_getter() for details.
// See objc-act.c:objc_synthesize_new_setter() for details.
Setr += getIvarAccessString(ClassDecl, OID) + " = ";
Setr += OID->getNameAsCString();
Setr += "; }";
@ -984,6 +989,35 @@ void RewriteObjC::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) {
ReplaceText(ClassDecl->getAtEndLoc(), 0, "// ", 3);
}
Stmt *RewriteObjC::RewritePropertySetter(BinaryOperator *BinOp,
ObjCPropertyRefExpr *PRE) {
// FIXME: Fill in the transform.
return BinOp;
}
Stmt *RewriteObjC::RewritePropertyRefExpr(ObjCPropertyRefExpr *PropRefExpr) {
// Synthesize a ObjCMessageExpr from a ObjCPropertyRefExpr.
// This allows us to reuse all the fun and games in SynthMessageExpr().
ObjCMessageExpr *MsgExpr;
ObjCPropertyDecl *PDecl = PropRefExpr->getProperty();
MsgExpr = new ObjCMessageExpr(PropRefExpr->getBase(),
PDecl->getGetterName(), PDecl->getType(),
PDecl->getGetterMethodDecl(),
SourceLocation(), SourceLocation(),
0, 0);
Stmt *ReplacingStmt = SynthMessageExpr(MsgExpr);
// Now do the actual rewrite.
ReplaceStmt(PropRefExpr, ReplacingStmt);
PropMsgExprs[ReplacingStmt] = PropRefExpr;
// delete PropRefExpr; elsewhere...
delete MsgExpr;
return ReplacingStmt;
}
Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,
SourceLocation OrigStart) {
ObjCIvarDecl *D = IV->getDecl();
@ -3986,6 +4020,15 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S))
return RewriteObjCIvarRefExpr(IvarRefExpr, OrigStmtRange.getBegin());
if (ObjCPropertyRefExpr *PropRefExpr = dyn_cast<ObjCPropertyRefExpr>(S))
return RewritePropertyRefExpr(PropRefExpr);
if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) {
if (BinOp->isAssignmentOp()) {
if (ObjCPropertyRefExpr *PRE = PropMsgExprs[BinOp->getLHS()])
return RewritePropertySetter(BinOp, PRE);
}
}
if (ObjCSelectorExpr *AtSelector = dyn_cast<ObjCSelectorExpr>(S))
return RewriteAtSelector(AtSelector);