]> granicus.if.org Git - clang/commitdiff
Remove the SmallVector from CXXTryStmt.
authorSam Weinig <sam.weinig@gmail.com>
Wed, 3 Feb 2010 02:09:59 +0000 (02:09 +0000)
committerSam Weinig <sam.weinig@gmail.com>
Wed, 3 Feb 2010 02:09:59 +0000 (02:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95190 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/StmtCXX.h
lib/AST/Stmt.cpp
lib/Sema/SemaStmt.cpp

index 09ea4ca2101be434e10f7a0bda4131c16e1a332c..6026707b1698f1dfb8f0fa956ecebb56921bb71b 100644 (file)
@@ -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<Stmt*, 4> 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<CompoundStmt>(Stmts[0]); }
   const CompoundStmt *getTryBlock() const {
     return llvm::cast<CompoundStmt>(Stmts[0]);
   }
 
-  unsigned getNumHandlers() const { return Stmts.size() - 1; }
+  unsigned getNumHandlers() const { return NumHandlers; }
   CXXCatchStmt *getHandler(unsigned i) {
     return llvm::cast<CXXCatchStmt>(Stmts[i + 1]);
   }
index a0830997dcdd577464e7bc829c413279f83e3c1f..e90eceec1b34a4965dacf1daf13aaa652a632c09 100644 (file)
@@ -339,6 +339,12 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece>&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; }
index 54a892ac560e65aa9cf96de6b6422ee22f781a8b..0fecb8ba8687463364d7342c9b1d393298d8be47 100644 (file)
@@ -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<Stmt*>(TryBlock.release()),
                                         Handlers, NumHandlers));
 }