forked from OSchip/llvm-project
parent
92b762e256
commit
ebcea988c2
|
@ -59,12 +59,16 @@ public:
|
|||
///
|
||||
class CXXTryStmt : public Stmt {
|
||||
SourceLocation TryLoc;
|
||||
|
||||
// First place is the guarded CompoundStatement. Subsequent are the handlers.
|
||||
// More than three handlers should be rare.
|
||||
llvm::SmallVector<Stmt*, 4> Stmts;
|
||||
Stmt **Stmts;
|
||||
unsigned NumHandlers;
|
||||
|
||||
protected:
|
||||
virtual void DoDestroy(ASTContext &Ctx);
|
||||
|
||||
public:
|
||||
CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock,
|
||||
CXXTryStmt(ASTContext &C, SourceLocation tryLoc, Stmt *tryBlock,
|
||||
Stmt **handlers, unsigned numHandlers);
|
||||
|
||||
virtual SourceRange getSourceRange() const {
|
||||
|
@ -72,14 +76,14 @@ public:
|
|||
}
|
||||
|
||||
SourceLocation getTryLoc() const { return TryLoc; }
|
||||
SourceLocation getEndLoc() const { return Stmts.back()->getLocEnd(); }
|
||||
SourceLocation getEndLoc() const { return Stmts[NumHandlers]->getLocEnd(); }
|
||||
|
||||
CompoundStmt *getTryBlock() { return llvm::cast<CompoundStmt>(Stmts[0]); }
|
||||
const CompoundStmt *getTryBlock() const {
|
||||
return llvm::cast<CompoundStmt>(Stmts[0]);
|
||||
}
|
||||
|
||||
unsigned getNumHandlers() const { return Stmts.size() - 1; }
|
||||
unsigned getNumHandlers() const { return NumHandlers; }
|
||||
CXXCatchStmt *getHandler(unsigned i) {
|
||||
return llvm::cast<CXXCatchStmt>(Stmts[i + 1]);
|
||||
}
|
||||
|
|
|
@ -339,6 +339,12 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece>&Pieces,
|
|||
}
|
||||
}
|
||||
|
||||
QualType CXXCatchStmt::getCaughtType() const {
|
||||
if (ExceptionDecl)
|
||||
return ExceptionDecl->getType();
|
||||
return QualType();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Constructors
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -401,6 +407,14 @@ ObjCAtCatchStmt::ObjCAtCatchStmt(SourceLocation atCatchLoc,
|
|||
RParenLoc = rparenloc;
|
||||
}
|
||||
|
||||
CXXTryStmt::CXXTryStmt(ASTContext &C, SourceLocation tryLoc, Stmt *tryBlock,
|
||||
Stmt **handlers, unsigned numHandlers)
|
||||
: Stmt(CXXTryStmtClass), TryLoc(tryLoc), NumHandlers(numHandlers) {
|
||||
Stmts = new (C) Stmt*[NumHandlers + 1];
|
||||
Stmts[0] = tryBlock;
|
||||
std::copy(handlers, handlers + NumHandlers, Stmts + 1);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AST Destruction.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -479,6 +493,14 @@ void AsmStmt::DoDestroy(ASTContext &C) {
|
|||
C.Deallocate((void *)this);
|
||||
}
|
||||
|
||||
void CXXTryStmt::DoDestroy(ASTContext& C) {
|
||||
DestroyChildren(C);
|
||||
C.Deallocate(Stmts);
|
||||
|
||||
this->~CXXTryStmt();
|
||||
C.Deallocate((void *)this);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Child Iterators for iterating over subexpressions/substatements
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -641,19 +663,6 @@ Stmt::child_iterator CXXCatchStmt::child_end() {
|
|||
return &HandlerBlock + 1;
|
||||
}
|
||||
|
||||
QualType CXXCatchStmt::getCaughtType() const {
|
||||
if (ExceptionDecl)
|
||||
return ExceptionDecl->getType();
|
||||
return QualType();
|
||||
}
|
||||
|
||||
// CXXTryStmt
|
||||
Stmt::child_iterator CXXTryStmt::child_begin() { return &Stmts[0]; }
|
||||
Stmt::child_iterator CXXTryStmt::child_end() { return &Stmts[0]+Stmts.size(); }
|
||||
|
||||
CXXTryStmt::CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock,
|
||||
Stmt **handlers, unsigned numHandlers)
|
||||
: Stmt(CXXTryStmtClass), TryLoc(tryLoc) {
|
||||
Stmts.push_back(tryBlock);
|
||||
Stmts.insert(Stmts.end(), handlers, handlers + numHandlers);
|
||||
}
|
||||
Stmt::child_iterator CXXTryStmt::child_end() { return &Stmts[0]+NumHandlers+1; }
|
||||
|
|
|
@ -1551,7 +1551,7 @@ Sema::ActOnCXXTryBlock(SourceLocation TryLoc, StmtArg TryBlock,
|
|||
|
||||
CurFunctionNeedsScopeChecking = true;
|
||||
RawHandlers.release();
|
||||
return Owned(new (Context) CXXTryStmt(TryLoc,
|
||||
return Owned(new (Context) CXXTryStmt(Context, TryLoc,
|
||||
static_cast<Stmt*>(TryBlock.release()),
|
||||
Handlers, NumHandlers));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue