diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-04-23 22:50:49 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-04-23 22:50:49 +0000 |
| commit | 96c79498fbcc1e7d03cba88725dffafb2b568c53 (patch) | |
| tree | 8c74d92c11e42f011bf0ced629759b8ebdb5b626 /clang/lib/Sema/TreeTransform.h | |
| parent | 11d1df442dfd0f526f659a5447df6dfe7695f41d (diff) | |
| download | bcm5719-llvm-96c79498fbcc1e7d03cba88725dffafb2b568c53.tar.gz bcm5719-llvm-96c79498fbcc1e7d03cba88725dffafb2b568c53.zip | |
Improve the AST representation of Objective-C @try/@catch/@finally
statements. Instead of the @try having a single @catch, where all of
the @catch's were chained (using an O(n^2) algorithm nonetheless),
@try just holds an array of its @catch blocks. The resulting AST is
slightly more compact (not important) and better represents the actual
language semantics (good).
llvm-svn: 102221
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index a41cbc38a29..8b2aa4e3088 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -896,9 +896,9 @@ public: /// Subclasses may override this routine to provide different behavior. OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, StmtArg TryBody, - StmtArg Catch, + MultiStmtArg CatchStmts, StmtArg Finally) { - return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(Catch), + return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts), move(Finally)); } @@ -3688,12 +3688,16 @@ TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { if (TryBody.isInvalid()) return SemaRef.StmtError(); - // Transform the @catch statement (if present). - OwningStmtResult Catch(SemaRef); - if (S->getCatchStmts()) { - Catch = getDerived().TransformStmt(S->getCatchStmts()); + // Transform the @catch statements (if present). + bool AnyCatchChanged = false; + ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef); + for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { + OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); if (Catch.isInvalid()) return SemaRef.StmtError(); + if (Catch.get() != S->getCatchStmt(I)) + AnyCatchChanged = true; + CatchStmts.push_back(Catch.release()); } // Transform the @finally statement (if present). @@ -3707,13 +3711,13 @@ TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { // If nothing changed, just retain this statement. if (!getDerived().AlwaysRebuild() && TryBody.get() == S->getTryBody() && - Catch.get() == S->getCatchStmts() && + !AnyCatchChanged && Finally.get() == S->getFinallyStmt()) return SemaRef.Owned(S->Retain()); // Build a new statement. return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody), - move(Catch), move(Finally)); + move_arg(CatchStmts), move(Finally)); } template<typename Derived> |

