diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-02-19 01:50:18 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-02-19 01:50:18 +0000 |
commit | ba7bc5584b8d46f4e8deb3a9d363256908fa86ea (patch) | |
tree | a856a516b4c63ffddf365713ea6e6316a02b056e /lib/AST/Expr.cpp | |
parent | 170e41d856f0bf39799fac9cc1e666bb857afa0c (diff) |
Revert: "Change InitListExpr to allocate the array for holding references"
This was causing buildbot breakage.
This reverts commit d46e952cc8cb8d9eed8657d9a0b267910a0f745a.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96652 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Expr.cpp')
-rw-r--r-- | lib/AST/Expr.cpp | 85 |
1 files changed, 27 insertions, 58 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 58776f47d9..fac65064c0 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -713,75 +713,40 @@ OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { return OverOps[Opc]; } -InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc, +InitListExpr::InitListExpr(SourceLocation lbraceloc, Expr **initExprs, unsigned numInits, SourceLocation rbraceloc) : Expr(InitListExprClass, QualType(), false, false), - InitExprs(0), NumInits(numInits), Capacity(numInits), LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0), - UnionFieldInit(0), HadArrayRangeDesignator(false) -{ - if (NumInits == 0) - return; - - InitExprs = new (C) Stmt*[Capacity]; - - for (unsigned I = 0; I != NumInits; ++I) { - Expr *Ex = initExprs[I]; - if (Ex->isTypeDependent()) + UnionFieldInit(0), HadArrayRangeDesignator(false) +{ + for (unsigned I = 0; I != numInits; ++I) { + if (initExprs[I]->isTypeDependent()) TypeDependent = true; - if (Ex->isValueDependent()) + if (initExprs[I]->isValueDependent()) ValueDependent = true; - InitExprs[I] = Ex; } + + InitExprs.insert(InitExprs.end(), initExprs, initExprs+numInits); } -void InitListExpr::DoDestroy(ASTContext &C) { - DestroyChildren(C); - if (InitExprs) - C.Deallocate(InitExprs); - this->~InitListExpr(); - C.Deallocate((void*) this); +void InitListExpr::reserveInits(unsigned NumInits) { + if (NumInits > InitExprs.size()) + InitExprs.reserve(NumInits); } -void InitListExpr::reserveInits(ASTContext &C, unsigned newCapacity) { - if (newCapacity > Capacity) { - if (!Capacity) - Capacity = newCapacity; - else if ((Capacity *= 2) < newCapacity) - Capacity = newCapacity; - - Stmt **newInits = new (C) Stmt*[Capacity]; - if (InitExprs) { - memcpy(newInits, InitExprs, NumInits * sizeof(*InitExprs)); - C.Deallocate(InitExprs); - } - InitExprs = newInits; - } +void InitListExpr::resizeInits(ASTContext &Context, unsigned NumInits) { + for (unsigned Idx = NumInits, LastIdx = InitExprs.size(); + Idx < LastIdx; ++Idx) + InitExprs[Idx]->Destroy(Context); + InitExprs.resize(NumInits, 0); } -void InitListExpr::resizeInits(ASTContext &C, unsigned N) { - // If the new number of expressions is less than the old one, destroy - // the expressions that are beyond the new size. - for (unsigned i = N, LastIdx = NumInits; i < LastIdx; ++i) - InitExprs[i]->Destroy(C); - - // If we are expanding the number of expressions, reserve space. - reserveInits(C, N); - - // If we are expanding the number of expressions, zero out beyond our - // current capacity. - for (unsigned i = NumInits; i < N; ++i) - InitExprs[i] = 0; - - NumInits = N; -} - -Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) { - if (Init >= NumInits) { - // Resize the number of initializers. This will adjust the amount - // of memory allocated as well as zero-pad the initializers. - resizeInits(C, Init+1); +Expr *InitListExpr::updateInit(unsigned Init, Expr *expr) { + if (Init >= InitExprs.size()) { + InitExprs.insert(InitExprs.end(), Init - InitExprs.size() + 1, 0); + InitExprs.back() = expr; + return 0; } Expr *Result = cast_or_null<Expr>(InitExprs[Init]); @@ -2621,8 +2586,12 @@ Stmt::child_iterator VAArgExpr::child_begin() { return &Val; } Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; } // InitListExpr -Stmt::child_iterator InitListExpr::child_begin() { return begin(); } -Stmt::child_iterator InitListExpr::child_end() { return end(); } +Stmt::child_iterator InitListExpr::child_begin() { + return InitExprs.size() ? &InitExprs[0] : 0; +} +Stmt::child_iterator InitListExpr::child_end() { + return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0; +} // DesignatedInitExpr Stmt::child_iterator DesignatedInitExpr::child_begin() { |