зеркало из https://github.com/microsoft/clang.git
Fixup more objc rwriter bug having to do with
rewriting of blocks which have objective-c stuff which need be rewritten as well. // rdar://9254348 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129300 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
09f43ed8a1
Коммит
1d015313b2
|
@ -245,6 +245,10 @@ public:
|
|||
/// printer to generate the replacement code. This returns true if the input
|
||||
/// could not be rewritten, or false if successful.
|
||||
bool ReplaceStmt(Stmt *From, Stmt *To);
|
||||
|
||||
/// ConvertToString converts statement 'From' to a string using the
|
||||
/// pretty pronter.
|
||||
std::string ConvertToString(Stmt *From);
|
||||
|
||||
/// getEditBuffer - This is like getRewriteBufferFor, but always returns a
|
||||
/// buffer, and allows you to write on it directly. This is useful if you
|
||||
|
|
|
@ -5519,27 +5519,34 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
|
|||
for (Stmt::child_range CI = S->children(); CI; ++CI)
|
||||
if (*CI) {
|
||||
Stmt *newStmt;
|
||||
Stmt *S = (*CI);
|
||||
if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S)) {
|
||||
Stmt *ChildStmt = (*CI);
|
||||
if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(ChildStmt)) {
|
||||
Expr *OldBase = IvarRefExpr->getBase();
|
||||
bool replaced = false;
|
||||
newStmt = RewriteObjCNestedIvarRefExpr(S, replaced);
|
||||
newStmt = RewriteObjCNestedIvarRefExpr(ChildStmt, replaced);
|
||||
if (replaced) {
|
||||
if (ObjCIvarRefExpr *IRE = dyn_cast<ObjCIvarRefExpr>(newStmt))
|
||||
ReplaceStmt(OldBase, IRE->getBase());
|
||||
else
|
||||
ReplaceStmt(S, newStmt);
|
||||
ReplaceStmt(ChildStmt, newStmt);
|
||||
}
|
||||
}
|
||||
else
|
||||
newStmt = RewriteFunctionBodyOrGlobalInitializer(S);
|
||||
if (newStmt)
|
||||
*CI = newStmt;
|
||||
newStmt = RewriteFunctionBodyOrGlobalInitializer(ChildStmt);
|
||||
if (newStmt) {
|
||||
if (Expr *PropOrImplicitRefExpr = dyn_cast<Expr>(ChildStmt))
|
||||
if (PropSetters[PropOrImplicitRefExpr] == S) {
|
||||
S = newStmt;
|
||||
newStmt = 0;
|
||||
}
|
||||
if (newStmt)
|
||||
*CI = newStmt;
|
||||
}
|
||||
// If dealing with an assignment with LHS being a property reference
|
||||
// expression, the entire assignment tree is rewritten into a property
|
||||
// setter messaging. This involvs the RHS too. Do not attempt to rewrite
|
||||
// RHS again.
|
||||
if (Expr *Exp = dyn_cast<Expr>(S))
|
||||
if (Expr *Exp = dyn_cast<Expr>(ChildStmt))
|
||||
if (isa<ObjCPropertyRefExpr>(Exp)) {
|
||||
if (PropSetters[Exp]) {
|
||||
++CI;
|
||||
|
@ -5565,7 +5572,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
|
|||
PropParentMap = 0;
|
||||
ImportedLocalExternalDecls.clear();
|
||||
// Now we snarf the rewritten text and stash it away for later use.
|
||||
std::string Str = Rewrite.getRewrittenText(BE->getSourceRange());
|
||||
std::string Str = Rewrite.ConvertToString(BE->getBody());
|
||||
RewrittenBlockExprs[BE] = Str;
|
||||
|
||||
Stmt *blockTranscribed = SynthBlockInitExpr(BE, InnerBlockDeclRefs);
|
||||
|
|
|
@ -303,3 +303,10 @@ bool Rewriter::ReplaceStmt(Stmt *From, Stmt *To) {
|
|||
ReplaceText(From->getLocStart(), Size, Str);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string Rewriter::ConvertToString(Stmt *From) {
|
||||
std::string SStr;
|
||||
llvm::raw_string_ostream S(SStr);
|
||||
From->printPretty(S, 0, PrintingPolicy(*LangOpts));
|
||||
return SStr;
|
||||
}
|
||||
|
|
|
@ -16,9 +16,14 @@ typedef void (^BLOCK_TYPE)(void);
|
|||
@implementation CoreDAVTaskGroup
|
||||
- (void)_finishInitialSync {
|
||||
CoreDAVTaskGroup *folderPost;
|
||||
[folderPost setCompletionBlock : (^{
|
||||
self.IVAR = 0;
|
||||
})];
|
||||
folderPost.completionBlock = ^{
|
||||
self.IVAR = 0;
|
||||
[self _finishInitialSync];
|
||||
};
|
||||
|
||||
[folderPost setCompletionBlock : (^{
|
||||
self.IVAR = 0;
|
||||
})];
|
||||
}
|
||||
@dynamic IVAR;
|
||||
- (void) setCompletionBlock : (BLOCK_TYPE) arg {}
|
||||
|
|
Загрузка…
Ссылка в новой задаче