Fix <rdar://problem/6210791> clang ObjC rewriter: @try / @catch block with no @finally does not call objc_exception_try_exit.
Need a couple tweaks to RewriteObjCTryStmt(). Need to deal with implicit finally clauses (to make sure objc_exception_try_exit is called). Also fixed a related bug where we need to generate an implicit @catch else clause (to again make sure objc_exception_try_exit is called). llvm-svn: 56104
This commit is contained in:
parent
27a907eb8c
commit
4adbe3116e
|
@ -1455,9 +1455,16 @@ Stmt *RewriteObjC::RewriteObjCTryStmt(ObjCAtTryStmt *S) {
|
||||||
SourceLocation bodyLoc = lastCatchBody->getLocEnd();
|
SourceLocation bodyLoc = lastCatchBody->getLocEnd();
|
||||||
assert(*SM->getCharacterData(bodyLoc) == '}' &&
|
assert(*SM->getCharacterData(bodyLoc) == '}' &&
|
||||||
"bogus @catch body location");
|
"bogus @catch body location");
|
||||||
bodyLoc = bodyLoc.getFileLocWithOffset(1);
|
|
||||||
buf = " } } /* @catch end */\n";
|
|
||||||
|
|
||||||
|
// Insert the last (implicit) else clause *before* the right curly brace.
|
||||||
|
bodyLoc = bodyLoc.getFileLocWithOffset(-1);
|
||||||
|
buf = "} /* last catch end */\n";
|
||||||
|
buf += "else {\n";
|
||||||
|
buf += " _rethrow = _caught;\n";
|
||||||
|
buf += " objc_exception_try_exit(&_stack);\n";
|
||||||
|
buf += "} } /* @catch end */\n";
|
||||||
|
if (!S->getFinallyStmt())
|
||||||
|
buf += "}\n";
|
||||||
InsertText(bodyLoc, buf.c_str(), buf.size());
|
InsertText(bodyLoc, buf.c_str(), buf.size());
|
||||||
|
|
||||||
// Set lastCurlyLoc
|
// Set lastCurlyLoc
|
||||||
|
@ -1488,6 +1495,12 @@ Stmt *RewriteObjC::RewriteObjCTryStmt(ObjCAtTryStmt *S) {
|
||||||
|
|
||||||
// Set lastCurlyLoc
|
// Set lastCurlyLoc
|
||||||
lastCurlyLoc = body->getLocEnd();
|
lastCurlyLoc = body->getLocEnd();
|
||||||
|
} else { /* no finally clause - make sure we synthesize an implicit one */
|
||||||
|
buf = "{ /* implicit finally clause */\n";
|
||||||
|
buf += " if (!_rethrow) objc_exception_try_exit(&_stack);\n";
|
||||||
|
buf += " if (_rethrow) objc_exception_throw(_rethrow);\n";
|
||||||
|
buf += "}";
|
||||||
|
ReplaceText(lastCurlyLoc, 1, buf.c_str(), buf.size());
|
||||||
}
|
}
|
||||||
// Now emit the final closing curly brace...
|
// Now emit the final closing curly brace...
|
||||||
lastCurlyLoc = lastCurlyLoc.getFileLocWithOffset(1);
|
lastCurlyLoc = lastCurlyLoc.getFileLocWithOffset(1);
|
||||||
|
|
Loading…
Reference in New Issue