Add accessors + iterator interface.

llvm-svn: 45378
This commit is contained in:
Chris Lattner 2007-12-28 05:25:02 +00:00
parent 180f0e9044
commit e4407ede20
2 changed files with 45 additions and 0 deletions

View File

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

View File

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