From: Sam Weinig Date: Wed, 3 Feb 2010 02:09:59 +0000 (+0000) Subject: Remove the SmallVector from CXXTryStmt. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b0e4cb6a88a4b4bd2ecdcc622e852fa3e20290c9;p=clang Remove the SmallVector from CXXTryStmt. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95190 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/StmtCXX.h b/include/clang/AST/StmtCXX.h index 09ea4ca210..6026707b16 100644 --- a/include/clang/AST/StmtCXX.h +++ b/include/clang/AST/StmtCXX.h @@ -59,12 +59,16 @@ public: /// class CXXTryStmt : public Stmt { SourceLocation TryLoc; + // First place is the guarded CompoundStatement. Subsequent are the handlers. - // More than three handlers should be rare. - llvm::SmallVector Stmts; + Stmt **Stmts; + unsigned NumHandlers; + +protected: + virtual void DoDestroy(ASTContext &Ctx); public: - CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock, + CXXTryStmt(ASTContext &C, SourceLocation tryLoc, Stmt *tryBlock, Stmt **handlers, unsigned numHandlers); virtual SourceRange getSourceRange() const { @@ -72,14 +76,14 @@ public: } SourceLocation getTryLoc() const { return TryLoc; } - SourceLocation getEndLoc() const { return Stmts.back()->getLocEnd(); } + SourceLocation getEndLoc() const { return Stmts[NumHandlers]->getLocEnd(); } CompoundStmt *getTryBlock() { return llvm::cast(Stmts[0]); } const CompoundStmt *getTryBlock() const { return llvm::cast(Stmts[0]); } - unsigned getNumHandlers() const { return Stmts.size() - 1; } + unsigned getNumHandlers() const { return NumHandlers; } CXXCatchStmt *getHandler(unsigned i) { return llvm::cast(Stmts[i + 1]); } diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index a0830997dc..e90eceec1b 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -339,6 +339,12 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl&Pieces, } } +QualType CXXCatchStmt::getCaughtType() const { + if (ExceptionDecl) + return ExceptionDecl->getType(); + return QualType(); +} + //===----------------------------------------------------------------------===// // Constructors //===----------------------------------------------------------------------===// @@ -401,6 +407,14 @@ ObjCAtCatchStmt::ObjCAtCatchStmt(SourceLocation atCatchLoc, RParenLoc = rparenloc; } +CXXTryStmt::CXXTryStmt(ASTContext &C, SourceLocation tryLoc, Stmt *tryBlock, + Stmt **handlers, unsigned numHandlers) + : Stmt(CXXTryStmtClass), TryLoc(tryLoc), NumHandlers(numHandlers) { + Stmts = new (C) Stmt*[NumHandlers + 1]; + Stmts[0] = tryBlock; + std::copy(handlers, handlers + NumHandlers, Stmts + 1); +} + //===----------------------------------------------------------------------===// // AST Destruction. //===----------------------------------------------------------------------===// @@ -479,6 +493,14 @@ void AsmStmt::DoDestroy(ASTContext &C) { C.Deallocate((void *)this); } +void CXXTryStmt::DoDestroy(ASTContext& C) { + DestroyChildren(C); + C.Deallocate(Stmts); + + this->~CXXTryStmt(); + C.Deallocate((void *)this); +} + //===----------------------------------------------------------------------===// // Child Iterators for iterating over subexpressions/substatements //===----------------------------------------------------------------------===// @@ -641,19 +663,6 @@ Stmt::child_iterator CXXCatchStmt::child_end() { return &HandlerBlock + 1; } -QualType CXXCatchStmt::getCaughtType() const { - if (ExceptionDecl) - return ExceptionDecl->getType(); - return QualType(); -} - // CXXTryStmt Stmt::child_iterator CXXTryStmt::child_begin() { return &Stmts[0]; } -Stmt::child_iterator CXXTryStmt::child_end() { return &Stmts[0]+Stmts.size(); } - -CXXTryStmt::CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock, - Stmt **handlers, unsigned numHandlers) - : Stmt(CXXTryStmtClass), TryLoc(tryLoc) { - Stmts.push_back(tryBlock); - Stmts.insert(Stmts.end(), handlers, handlers + numHandlers); -} +Stmt::child_iterator CXXTryStmt::child_end() { return &Stmts[0]+NumHandlers+1; } diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 54a892ac56..0fecb8ba86 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1551,7 +1551,7 @@ Sema::ActOnCXXTryBlock(SourceLocation TryLoc, StmtArg TryBlock, CurFunctionNeedsScopeChecking = true; RawHandlers.release(); - return Owned(new (Context) CXXTryStmt(TryLoc, + return Owned(new (Context) CXXTryStmt(Context, TryLoc, static_cast(TryBlock.release()), Handlers, NumHandlers)); }