зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
bfc7930db0
Коммит
d18b3299de
30
AST/Expr.cpp
30
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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче