From c5ae899b4bbf65488445316c63168079177db0ed Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 1 May 2008 02:04:18 +0000 Subject: [PATCH] Extend InitListExpr API/IMPL to support arbitrary add/remove (in support of the initializer rewrite I am doing). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50511 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 31 +++++++++++++++++++++---------- lib/AST/Expr.cpp | 11 ++++------- lib/AST/StmtSerialization.cpp | 14 ++++++++------ 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 6bd5bbcbd5..8a25832874 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -21,6 +21,7 @@ #include "clang/Basic/IdentifierTable.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/APFloat.h" +#include namespace clang { class IdentifierInfo; @@ -1280,32 +1281,42 @@ public: /// int x = { 1 }; int y[2] = { {1}, {2} }; /// class InitListExpr : public Expr { - Expr **InitExprs; - unsigned NumInits; + std::vector InitExprs; SourceLocation LBraceLoc, RBraceLoc; public: InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits, SourceLocation rbraceloc); - ~InitListExpr() { - delete [] InitExprs; - } - unsigned getNumInits() const { return NumInits; } + unsigned getNumInits() const { return InitExprs.size(); } const Expr* getInit(unsigned Init) const { - assert(Init < NumInits && "Initializer access out of range!"); + assert(Init < getNumInits() && "Initializer access out of range!"); return InitExprs[Init]; } Expr* getInit(unsigned Init) { - assert(Init < NumInits && "Initializer access out of range!"); + assert(Init < getNumInits() && "Initializer access out of range!"); return InitExprs[Init]; } void setInit(unsigned Init, Expr *expr) { - assert(Init < NumInits && "Initializer access out of range!"); + assert(Init < getNumInits() && "Initializer access out of range!"); InitExprs[Init] = expr; } + + // Dynamic removal/addition (for constructing implicit InitExpr's). + void removeInit(unsigned Init) { + InitExprs.erase(InitExprs.begin()+Init); + } + void addInit(unsigned Init, Expr *expr) { + InitExprs.insert(InitExprs.begin()+Init, expr); + } + + // Explicit InitListExpr's originate from source code (and have valid source + // locations). Implicit InitListExpr's are created by the semantic analyzer. + bool isExplicit() { + return LBraceLoc.isValid() && RBraceLoc.isValid(); + } virtual SourceRange getSourceRange() const { return SourceRange(LBraceLoc, RBraceLoc); @@ -1325,7 +1336,7 @@ public: private: // Used by serializer. InitListExpr() : Expr(InitListExprClass, QualType()), - InitExprs(NULL), NumInits(0) {} + InitExprs(NULL) {} }; /// ObjCStringLiteral, used for Objective-C string literals diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 264ef7b0e8..67e39b6480 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -254,14 +254,11 @@ const char *BinaryOperator::getOpcodeStr(Opcode Op) { InitListExpr::InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits, SourceLocation rbraceloc) - : Expr(InitListExprClass, QualType()) - , NumInits(numinits) - , LBraceLoc(lbraceloc) - , RBraceLoc(rbraceloc) + : Expr(InitListExprClass, QualType()), + LBraceLoc(lbraceloc), RBraceLoc(rbraceloc) { - InitExprs = new Expr*[numinits]; for (unsigned i = 0; i != numinits; i++) - InitExprs[i] = initexprs[i]; + InitExprs.push_back(initexprs[i]); } //===----------------------------------------------------------------------===// @@ -1368,7 +1365,7 @@ Stmt::child_iterator InitListExpr::child_begin() { return reinterpret_cast(&InitExprs[0]); } Stmt::child_iterator InitListExpr::child_end() { - return reinterpret_cast(&InitExprs[NumInits]); + return reinterpret_cast(&InitExprs[getNumInits()]); } // ObjCStringLiteral diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp index 7058c0ce2f..3bec743740 100644 --- a/lib/AST/StmtSerialization.cpp +++ b/lib/AST/StmtSerialization.cpp @@ -647,18 +647,20 @@ IndirectGotoStmt* IndirectGotoStmt::CreateImpl(Deserializer& D, ASTContext& C) { void InitListExpr::EmitImpl(Serializer& S) const { S.Emit(LBraceLoc); S.Emit(RBraceLoc); - S.EmitInt(NumInits); - S.BatchEmitOwnedPtrs(NumInits,InitExprs); + S.EmitInt(InitExprs.size()); + if (!InitExprs.empty()) S.BatchEmitOwnedPtrs(InitExprs.size(), &InitExprs[0]); } InitListExpr* InitListExpr::CreateImpl(Deserializer& D, ASTContext& C) { InitListExpr* expr = new InitListExpr(); expr->LBraceLoc = SourceLocation::ReadVal(D); expr->RBraceLoc = SourceLocation::ReadVal(D); - expr->NumInits = D.ReadInt(); - assert(expr->NumInits); - expr->InitExprs = new Expr*[expr->NumInits]; - D.BatchReadOwnedPtrs(expr->NumInits, expr->InitExprs, C); + unsigned size = D.ReadInt(); + assert(size); + expr->InitExprs.reserve(size); + for (unsigned i = 0 ; i < size; ++i) expr->InitExprs.push_back(0); + + D.BatchReadOwnedPtrs(size, &expr->InitExprs[0], C); return expr; } -- 2.40.0