aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReaderStmt.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-28 09:31:48 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-28 09:31:48 +0000
commit36c76f0bea0d3595a25a5362225c642019cc3176 (patch)
treebae41e5fde10c596f8e219c9de0ad5b4c9b88b0f /lib/Frontend/PCHReaderStmt.cpp
parent17cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4 (diff)
Refactor PCH reading/writing of template arguments passed to expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106997 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReaderStmt.cpp')
-rw-r--r--lib/Frontend/PCHReaderStmt.cpp82
1 files changed, 43 insertions, 39 deletions
diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp
index 1cdade5cc1..a2334d7330 100644
--- a/lib/Frontend/PCHReaderStmt.cpp
+++ b/lib/Frontend/PCHReaderStmt.cpp
@@ -19,14 +19,6 @@ using namespace clang;
namespace {
- class StmtStackExprReader : public PCHReader::ExprReader {
- llvm::SmallVectorImpl<Stmt *>::iterator StmtI;
- public:
- StmtStackExprReader(const llvm::SmallVectorImpl<Stmt *>::iterator &stmtI)
- : StmtI(stmtI) { }
- virtual Expr *Read() { return cast_or_null<Expr>(*StmtI++); }
- };
-
class PCHStmtReader : public StmtVisitor<PCHStmtReader, unsigned> {
PCHReader &Reader;
const PCHReader::RecordData &Record;
@@ -45,6 +37,13 @@ namespace {
/// \brief The number of record fields required for the Expr class
/// itself.
static const unsigned NumExprFields = NumStmtFields + 3;
+
+ /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
+ /// \return the number of Exprs that were read.
+ unsigned
+ ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
+ unsigned NumTemplateArgs,
+ llvm::SmallVectorImpl<Stmt *>::iterator EndOfExprs);
// Each of the Visit* functions reads in part of the expression
// from the given record and the current expression stack, then
@@ -156,6 +155,34 @@ namespace {
};
}
+unsigned PCHStmtReader::
+ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
+ unsigned NumTemplateArgs,
+ llvm::SmallVectorImpl<Stmt *>::iterator EndOfExprs) {
+
+ class StmtStackExprReader : public PCHReader::ExprReader {
+ llvm::SmallVectorImpl<Stmt *>::iterator StmtI;
+ public:
+ StmtStackExprReader(const llvm::SmallVectorImpl<Stmt *>::iterator &stmtI)
+ : StmtI(stmtI) { }
+ virtual Expr *Read() { return cast_or_null<Expr>(*StmtI++); }
+ };
+
+ unsigned NumExprs = Record[Idx++];
+
+ TemplateArgumentListInfo ArgInfo;
+ ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
+ ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
+
+ StmtStackExprReader ExprReader(EndOfExprs - NumExprs);
+ for (unsigned i = 0; i != NumTemplateArgs; ++i)
+ ArgInfo.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx,
+ ExprReader));
+ ArgList.initializeFrom(ArgInfo);
+
+ return NumExprs;
+}
+
unsigned PCHStmtReader::VisitStmt(Stmt *S) {
assert(Idx == NumStmtFields && "Incorrect statement field count");
return 0;
@@ -1138,23 +1165,10 @@ PCHStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
unsigned NumTemplateArgs = Record[Idx++];
assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
"Read wrong record during creation ?");
- if (E->hasExplicitTemplateArgs()) {
- TemplateArgumentListInfo ArgInfo;
- ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
- ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
-
- NumExprs = Record[Idx++];
- llvm::SmallVectorImpl<Stmt *>::iterator
- StartOfExprs = StmtStack.end() - NumExprs;
- if (isa<UnresolvedMemberExpr>(E))
- --StartOfExprs; // UnresolvedMemberExpr contains an Expr;
- StmtStackExprReader ExprReader(StartOfExprs);
- for (unsigned i = 0; i != NumTemplateArgs; ++i)
- ArgInfo.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx,
- ExprReader));
-
- E->initializeTemplateArgumentsFrom(ArgInfo);
- }
+ if (E->hasExplicitTemplateArgs())
+ NumExprs
+ = ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
+ NumTemplateArgs, StmtStack.end());
E->setBase(cast_or_null<Expr>(StmtStack.back()));
E->setBaseType(Reader.GetType(Record[Idx++]));
@@ -1192,21 +1206,11 @@ unsigned PCHStmtReader::VisitOverloadExpr(OverloadExpr *E) {
assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
"Read wrong record during creation ?");
if (E->hasExplicitTemplateArgs()) {
- TemplateArgumentListInfo ArgInfo;
- ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
- ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
-
- NumExprs = Record[Idx++];
- llvm::SmallVectorImpl<Stmt *>::iterator
- StartOfExprs = StmtStack.end() - NumExprs;
+ llvm::SmallVectorImpl<Stmt *>::iterator EndOfExprs = StmtStack.end();
if (isa<UnresolvedMemberExpr>(E))
- --StartOfExprs; // UnresolvedMemberExpr contains an Expr;
- StmtStackExprReader ExprReader(StartOfExprs);
- for (unsigned i = 0; i != NumTemplateArgs; ++i)
- ArgInfo.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx,
- ExprReader));
-
- E->getExplicitTemplateArgs().initializeFrom(ArgInfo);
+ --EndOfExprs; // UnresolvedMemberExpr contains an Expr.
+ NumExprs = ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
+ NumTemplateArgs, EndOfExprs);
}
unsigned NumDecls = Record[Idx++];