From: Chris Lattner Date: Fri, 28 Dec 2007 05:25:02 +0000 (+0000) Subject: Add accessors + iterator interface. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d18b3299debb7b0dbd9d34d9369189dc98c87f53;p=clang Add accessors + iterator interface. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45378 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index e814d58328..94d99ab4bd 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -88,6 +88,36 @@ CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t, RParenLoc = rparenloc; } +/// setNumArgs - This changes the number of arguments present in this call. +/// Any orphaned expressions are deleted by this, and any new operands are set +/// to null. +void CallExpr::setNumArgs(unsigned NumArgs) { + // No change, just return. + if (NumArgs == getNumArgs()) return; + + // If shrinking # arguments, just delete the extras and forgot them. + if (NumArgs < getNumArgs()) { + for (unsigned i = NumArgs, e = getNumArgs(); i != e; ++i) + delete getArg(i); + this->NumArgs = NumArgs; + return; + } + + // Otherwise, we are growing the # arguments. New an bigger argument array. + Expr **NewSubExprs = new Expr*[NumArgs+1]; + // Copy over args. + for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i) + NewSubExprs[i] = SubExprs[i]; + // Null out new args. + for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i) + NewSubExprs[i] = 0; + + delete[] SubExprs; + SubExprs = NewSubExprs; + this->NumArgs = NumArgs; +} + + bool CallExpr::isBuiltinClassifyType(llvm::APSInt &Result) const { // The following enum mimics gcc's internal "typeclass.h" file. enum gcc_type_class { diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index b82db0e0ff..aba11ea9ad 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -585,12 +585,27 @@ public: assert(Arg < NumArgs && "Arg access out of range!"); SubExprs[Arg+ARGS_START] = ArgExpr; } + + /// setNumArgs - This changes the number of arguments present in this call. + /// Any orphaned expressions are deleted by this, and any new operands are set + /// to null. + void setNumArgs(unsigned NumArgs); + + typedef Expr **arg_iterator; + typedef Expr * const *arg_const_iterator; + arg_iterator arg_begin() { return SubExprs+ARGS_START; } + arg_iterator arg_end() { return SubExprs+ARGS_START+getNumArgs(); } + arg_const_iterator arg_begin() const { return SubExprs+ARGS_START; } + arg_const_iterator arg_end() const { return SubExprs+ARGS_START+getNumArgs(); } + + /// getNumCommas - Return the number of commas that must have been present in /// this function call. unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } bool isBuiltinClassifyType(llvm::APSInt &Result) const; + SourceLocation getRParenLoc() const { return RParenLoc; } SourceRange getSourceRange() const { return SourceRange(getCallee()->getLocStart(), RParenLoc); }