diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 19 | ||||
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 16 |
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 300761a0e5..26b915800a 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -497,6 +497,7 @@ namespace { unsigned VisitObjCEncodeExpr(ObjCEncodeExpr *E); unsigned VisitObjCSelectorExpr(ObjCSelectorExpr *E); unsigned VisitObjCProtocolExpr(ObjCProtocolExpr *E); + unsigned VisitObjCMessageExpr(ObjCMessageExpr *E); }; } @@ -1080,6 +1081,21 @@ unsigned PCHStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { return 0; } +unsigned PCHStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { + VisitExpr(E); + E->setNumArgs(Record[Idx++]); + SourceRange SR(SourceLocation::getFromRawEncoding(Record[Idx++]), + SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setSourceRange(SR); + E->setSelector(Reader.GetSelector(Record, Idx)); + E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); + // FIXME: deal with class messages. + E->setReceiver(cast<Expr>(StmtStack[StmtStack.size() - E->getNumArgs() - 1])); + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) + E->setArg(I, cast<Expr>(StmtStack[StmtStack.size() - N + I])); + return E->getNumArgs() + 1; +} + //===----------------------------------------------------------------------===// // PCH reader implementation @@ -3368,6 +3384,9 @@ Stmt *PCHReader::ReadStmt() { case pch::EXPR_OBJC_PROTOCOL_EXPR: S = new (Context) ObjCProtocolExpr(Empty); break; + case pch::EXPR_OBJC_MESSAGE_EXPR: + S = new (Context) ObjCMessageExpr(Empty); + break; } // We hit a STMT_STOP, so we're done with this expression. diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 5a410b1cf8..f8c4a779fb 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -672,6 +672,7 @@ namespace { void VisitObjCEncodeExpr(ObjCEncodeExpr *E); void VisitObjCSelectorExpr(ObjCSelectorExpr *E); void VisitObjCProtocolExpr(ObjCProtocolExpr *E); + void VisitObjCMessageExpr(ObjCMessageExpr *E); }; } @@ -1198,6 +1199,21 @@ void PCHStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { Code = pch::EXPR_OBJC_PROTOCOL_EXPR; } +void PCHStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) { + VisitExpr(E); + Record.push_back(E->getNumArgs()); + Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record); + Writer.AddSourceLocation(E->getSourceRange().getEnd(), Record); + Writer.AddSelectorRef(E->getSelector(), Record); + Writer.AddDeclRef(E->getMethodDecl(), Record); // optional + // FIXME: deal with class messages. + Writer.WriteSubStmt(E->getReceiver()); + for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end(); + Arg != ArgEnd; ++Arg) + Writer.WriteSubStmt(*Arg); + Code = pch::EXPR_OBJC_MESSAGE_EXPR; +} + //===----------------------------------------------------------------------===// // PCHWriter Implementation |