]> granicus.if.org Git - clang/commitdiff
Extend InitListExpr API/IMPL to support arbitrary add/remove (in support of the initi...
authorSteve Naroff <snaroff@apple.com>
Thu, 1 May 2008 02:04:18 +0000 (02:04 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 1 May 2008 02:04:18 +0000 (02:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50511 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/AST/StmtSerialization.cpp

index 6bd5bbcbd5b1c131c30765a47b57ecb221c11478..8a25832874e3f36dd148e17c360ff039457fbb1c 100644 (file)
@@ -21,6 +21,7 @@
 #include "clang/Basic/IdentifierTable.h"
 #include "llvm/ADT/APSInt.h"
 #include "llvm/ADT/APFloat.h"
+#include <vector>
 
 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<Expr *> 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
index 264ef7b0e8ca7cd8d39d8168c54079fa885ebe41..67e39b648064a8f1a4e5576ca7443cda7a761425 100644 (file)
@@ -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<Stmt**>(&InitExprs[0]);
 }
 Stmt::child_iterator InitListExpr::child_end() {
-  return reinterpret_cast<Stmt**>(&InitExprs[NumInits]);
+  return reinterpret_cast<Stmt**>(&InitExprs[getNumInits()]);
 }
 
 // ObjCStringLiteral
index 7058c0ce2f19c7944e0bb3ee2a776be8f1b3a6f0..3bec743740663b937d4852150ca7c4bde2cd92a5 100644 (file)
@@ -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;
 }