From 013041eef05bc87f50eae1b8ab8aee7c1c6ecc86 Mon Sep 17 00:00:00 2001 From: Ted Kremenek <kremenek@apple.com> Date: Fri, 19 Feb 2010 01:50:18 +0000 Subject: [PATCH] Revert: "Change InitListExpr to allocate the array for holding references" This was causing buildbot breakage. This reverts commit d46e952cc8cb8d9eed8657d9a0b267910a0f745a. llvm-svn: 96652 --- clang/include/clang/AST/Expr.h | 35 +++++------- clang/lib/AST/Expr.cpp | 85 +++++++++------------------- clang/lib/Frontend/PCHReaderStmt.cpp | 4 +- clang/lib/Frontend/RewriteObjC.cpp | 16 ++---- clang/lib/Sema/SemaExpr.cpp | 10 ++-- clang/lib/Sema/SemaInit.cpp | 15 +++-- 6 files changed, 60 insertions(+), 105 deletions(-) diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index ecb821eb671c..23076b93e13b 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -2419,15 +2419,8 @@ public: /// return NULL, indicating that the current initializer list also /// serves as its syntactic form. class InitListExpr : public Expr { - /// The initializers. - // FIXME: Instead of directly maintaining the initializer array, - // we may wish to use a specialized vector class that uses ASTContext - // to allocate memory. This will keep the implementation simpler, and - // we can possibly use ASTContext to recylce memory even when using - // a BumpPtrAllocator. - Stmt **InitExprs; - unsigned NumInits, Capacity; - + // FIXME: Eliminate this vector in favor of ASTContext allocation + std::vector<Stmt *> InitExprs; SourceLocation LBraceLoc, RBraceLoc; /// Contains the initializer list that describes the syntactic form @@ -2443,15 +2436,13 @@ class InitListExpr : public Expr { bool HadArrayRangeDesignator; public: - InitListExpr(ASTContext &C, SourceLocation lbraceloc, Expr **initexprs, - unsigned numinits, SourceLocation rbraceloc); - - virtual void DoDestroy(ASTContext &C); + InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits, + SourceLocation rbraceloc); /// \brief Build an empty initializer list. explicit InitListExpr(EmptyShell Empty) : Expr(InitListExprClass, Empty) { } - unsigned getNumInits() const { return NumInits; } + unsigned getNumInits() const { return InitExprs.size(); } const Expr* getInit(unsigned Init) const { assert(Init < getNumInits() && "Initializer access out of range!"); @@ -2469,7 +2460,7 @@ public: } /// \brief Reserve space for some number of initializers. - void reserveInits(ASTContext &Context, unsigned NumInits); + void reserveInits(unsigned NumInits); /// @brief Specify the number of initializers /// @@ -2486,7 +2477,7 @@ public: /// When @p Init is out of range for this initializer list, the /// initializer list will be extended with NULL expressions to /// accomodate the new entry. - Expr *updateInit(ASTContext &Context, unsigned Init, Expr *expr); + Expr *updateInit(unsigned Init, Expr *expr); /// \brief If this initializes a union, specifies which field in the /// union to initialize. @@ -2532,13 +2523,13 @@ public: virtual child_iterator child_begin(); virtual child_iterator child_end(); - typedef Stmt** iterator; - typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::vector<Stmt *>::iterator iterator; + typedef std::vector<Stmt *>::reverse_iterator reverse_iterator; - iterator begin() { return InitExprs ? InitExprs : 0; } - iterator end() { return InitExprs ? InitExprs + NumInits : 0; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } + iterator begin() { return InitExprs.begin(); } + iterator end() { return InitExprs.end(); } + reverse_iterator rbegin() { return InitExprs.rbegin(); } + reverse_iterator rend() { return InitExprs.rend(); } }; /// @brief Represents a C99 designated initializer expression. diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 58776f47d97e..fac65064c07c 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/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() { diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index c69a5dc9dc16..d123694d699d 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -554,9 +554,9 @@ unsigned PCHStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { unsigned PCHStmtReader::VisitInitListExpr(InitListExpr *E) { VisitExpr(E); unsigned NumInits = Record[Idx++]; - E->reserveInits(*Reader.getContext(), NumInits); + E->reserveInits(NumInits); for (unsigned I = 0; I != NumInits; ++I) - E->updateInit(*Reader.getContext(), I, + E->updateInit(I, cast<Expr>(StmtStack[StmtStack.size() - NumInits - 1 + I])); E->setSyntacticForm(cast_or_null<InitListExpr>(StmtStack.back())); E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 40d444d94e43..fff8b54ba6cb 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -2613,11 +2613,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) { CastExpr::CK_Unknown, SuperRep); } else { // (struct objc_super) { <exprs from above> } - InitListExpr *ILE = new (Context) InitListExpr(*Context, - SourceLocation(), - &InitExprs[0], - InitExprs.size(), - SourceLocation()); + InitListExpr *ILE = new (Context) InitListExpr(SourceLocation(), + &InitExprs[0], InitExprs.size(), + SourceLocation()); TypeSourceInfo *superTInfo = Context->getTrivialTypeSourceInfo(superType); SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo, @@ -2700,11 +2698,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) { CastExpr::CK_Unknown, SuperRep); } else { // (struct objc_super) { <exprs from above> } - InitListExpr *ILE = new (Context) InitListExpr(*Context, - SourceLocation(), - &InitExprs[0], - InitExprs.size(), - SourceLocation()); + InitListExpr *ILE = new (Context) InitListExpr(SourceLocation(), + &InitExprs[0], InitExprs.size(), + SourceLocation()); TypeSourceInfo *superTInfo = Context->getTrivialTypeSourceInfo(superType); SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo, diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0d54a1641272..e950be048587 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3763,8 +3763,8 @@ Sema::ActOnInitList(SourceLocation LBraceLoc, MultiExprArg initlist, // Semantic analysis for initializers is done by ActOnDeclarator() and // CheckInitializer() - it requires knowledge of the object being intialized. - InitListExpr *E = new (Context) InitListExpr(Context, LBraceLoc, InitList, - NumInit, RBraceLoc); + InitListExpr *E = new (Context) InitListExpr(LBraceLoc, InitList, NumInit, + RBraceLoc); E->setType(Context.VoidTy); // FIXME: just a place holder for now. return Owned(E); } @@ -4038,8 +4038,7 @@ Sema::ActOnCastOfParenListExpr(Scope *S, SourceLocation LParenLoc, // FIXME: This means that pretty-printing the final AST will produce curly // braces instead of the original commas. Op.release(); - InitListExpr *E = new (Context) InitListExpr(Context, LParenLoc, - &initExprs[0], + InitListExpr *E = new (Context) InitListExpr(LParenLoc, &initExprs[0], initExprs.size(), RParenLoc); E->setType(Ty); return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, Owned(E)); @@ -4753,7 +4752,8 @@ static void ConstructTransparentUnion(ASTContext &C, Expr *&E, QualType UnionType, FieldDecl *Field) { // Build an initializer list that designates the appropriate member // of the transparent union. - InitListExpr *Initializer = new (C) InitListExpr(C, SourceLocation(), &E, 1, + InitListExpr *Initializer = new (C) InitListExpr(SourceLocation(), + &E, 1, SourceLocation()); Initializer->setType(UnionType); Initializer->setInitializedFieldInUnion(Field); diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 1c4e2c837aee..7b4a41777b6a 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -280,7 +280,7 @@ void InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, // extend the initializer list to include the constructor // call and make a note that we'll need to take another pass // through the initializer list. - ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); + ILE->updateInit(Init, MemberInit.takeAs<Expr>()); RequiresSecondPass = true; } } else if (InitListExpr *InnerILE @@ -390,7 +390,7 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity, // extend the initializer list to include the constructor // call and make a note that we'll need to take another pass // through the initializer list. - ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); + ILE->updateInit(Init, ElementInit.takeAs<Expr>()); RequiresSecondPass = true; } } else if (InitListExpr *InnerILE @@ -1669,8 +1669,8 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, } InitListExpr *Result - = new (SemaRef.Context) InitListExpr(SemaRef.Context, InitRange.getBegin(), - 0, 0, InitRange.getEnd()); + = new (SemaRef.Context) InitListExpr(InitRange.getBegin(), 0, 0, + InitRange.getEnd()); Result->setType(CurrentObjectType.getNonReferenceType()); @@ -1707,12 +1707,12 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, if (NumElements < NumInits) NumElements = IList->getNumInits(); - Result->reserveInits(SemaRef.Context, NumElements); + Result->reserveInits(NumElements); // Link this new initializer list into the structured initializer // lists. if (StructuredList) - StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); + StructuredList->updateInit(StructuredIndex, Result); else { Result->setSyntacticForm(IList); SyntacticToSemantic[IList] = Result; @@ -1730,8 +1730,7 @@ void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, if (!StructuredList) return; - if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, - StructuredIndex, expr)) { + if (Expr *PrevInit = StructuredList->updateInit(StructuredIndex, expr)) { // This initializer overwrites a previous initializer. Warn. SemaRef.Diag(expr->getSourceRange().getBegin(), diag::warn_initializer_overrides) -- GitLab