Add accessors + iterator interface.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45378 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-12-28 05:25:02 +00:00
Родитель bfc7930db0
Коммит d18b3299de
2 изменённых файлов: 45 добавлений и 0 удалений

Просмотреть файл

@ -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 {

Просмотреть файл

@ -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);
}