summaryrefslogtreecommitdiffstats
path: root/clang/Lex/MacroExpander.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-07-15 07:42:55 +0000
committerChris Lattner <sabre@nondot.org>2006-07-15 07:42:55 +0000
commitee8760b21bfab1278618194438674c1e0fe14b8f (patch)
tree2e31d28619c4af0506ddd2e332d1e0d96da83307 /clang/Lex/MacroExpander.cpp
parentc653246bfbb1c6a7061e8d9d806b92070495c2dc (diff)
downloadbcm5719-llvm-ee8760b21bfab1278618194438674c1e0fe14b8f.tar.gz
bcm5719-llvm-ee8760b21bfab1278618194438674c1e0fe14b8f.zip
Rename macroformalargs -> MacroArgs, as it represents the actual arguments,
not the formal arguments, to a macro. llvm-svn: 38716
Diffstat (limited to 'clang/Lex/MacroExpander.cpp')
-rw-r--r--clang/Lex/MacroExpander.cpp52
1 files changed, 37 insertions, 15 deletions
diff --git a/clang/Lex/MacroExpander.cpp b/clang/Lex/MacroExpander.cpp
index 3fb0346c3c5..b420ce168e3 100644
--- a/clang/Lex/MacroExpander.cpp
+++ b/clang/Lex/MacroExpander.cpp
@@ -20,20 +20,39 @@ using namespace llvm;
using namespace clang;
//===----------------------------------------------------------------------===//
-// MacroFormalArgs Implementation
+// MacroArgs Implementation
//===----------------------------------------------------------------------===//
-MacroFormalArgs::MacroFormalArgs(const MacroInfo *MI) {
+MacroArgs::MacroArgs(const MacroInfo *MI) {
assert(MI->isFunctionLike() &&
- "Can't have formal args for an object-like macro!");
+ "Can't have args for an object-like macro!");
// Reserve space for arguments to avoid reallocation.
unsigned NumArgs = MI->getNumArgs();
if (MI->isC99Varargs() || MI->isGNUVarargs())
NumArgs += 3; // Varargs can have more than this, just some guess.
- ArgTokens.reserve(NumArgs);
+ UnexpArgTokens.reserve(NumArgs);
}
+/// addArgument - Add an argument for this invocation. This method destroys
+/// the vector passed in to avoid extraneous memory copies. This adds the EOF
+/// token to the end of the argument list as a marker. 'Loc' specifies a
+/// location at the end of the argument, e.g. the ',' token or the ')'.
+void MacroArgs::addArgument(std::vector<LexerToken> &ArgToks,
+ SourceLocation Loc) {
+ UnexpArgTokens.push_back(std::vector<LexerToken>());
+ UnexpArgTokens.back().swap(ArgToks);
+
+ // Add a marker EOF token to the end of the argument list, useful for handling
+ // empty arguments and macro pre-expansion.
+ LexerToken EOFTok;
+ EOFTok.StartToken();
+ EOFTok.SetKind(tok::eof);
+ EOFTok.SetLocation(Loc);
+ UnexpArgTokens.back().push_back(EOFTok);
+}
+
+
/// StringifyArgument - Implement C99 6.10.3.2p2, converting a sequence of
/// tokens into the literal string token that should be produced by the C #
/// preprocessor operator.
@@ -111,15 +130,16 @@ static LexerToken StringifyArgument(const std::vector<LexerToken> &Toks,
/// getStringifiedArgument - Compute, cache, and return the specified argument
/// that has been 'stringified' as required by the # operator.
-const LexerToken &MacroFormalArgs::getStringifiedArgument(unsigned ArgNo,
- Preprocessor &PP) {
- assert(ArgNo < ArgTokens.size() && "Invalid argument number!");
+const LexerToken &MacroArgs::getStringifiedArgument(unsigned ArgNo,
+ Preprocessor &PP) {
+ assert(ArgNo < ExpArgTokens.size() && "Invalid argument number!");
if (StringifiedArgs.empty()) {
- StringifiedArgs.resize(ArgTokens.size());
- memset(&StringifiedArgs[0], 0, sizeof(StringifiedArgs[0])*ArgTokens.size());
+ StringifiedArgs.resize(ExpArgTokens.size());
+ memset(&StringifiedArgs[0], 0,
+ sizeof(StringifiedArgs[0])*getNumArguments());
}
if (StringifiedArgs[ArgNo].getKind() != tok::string_literal)
- StringifiedArgs[ArgNo] = StringifyArgument(ArgTokens[ArgNo], PP);
+ StringifiedArgs[ArgNo] = StringifyArgument(ExpArgTokens[ArgNo], PP);
return StringifiedArgs[ArgNo];
}
@@ -127,10 +147,10 @@ const LexerToken &MacroFormalArgs::getStringifiedArgument(unsigned ArgNo,
// MacroExpander Implementation
//===----------------------------------------------------------------------===//
-MacroExpander::MacroExpander(LexerToken &Tok, MacroFormalArgs *Formals,
+MacroExpander::MacroExpander(LexerToken &Tok, MacroArgs *Actuals,
Preprocessor &pp)
: Macro(*Tok.getIdentifierInfo()->getMacroInfo()),
- FormalArgs(Formals), PP(pp), CurToken(0),
+ ActualArgs(Actuals), PP(pp), CurToken(0),
InstantiateLoc(Tok.getLocation()),
AtStartOfLine(Tok.isAtStartOfLine()),
HasLeadingSpace(Tok.hasLeadingSpace()) {
@@ -149,9 +169,11 @@ MacroExpander::~MacroExpander() {
delete MacroTokens;
// MacroExpander owns its formal arguments.
- delete FormalArgs;
+ delete ActualArgs;
}
+
+
/// Expand the arguments of a function-like macro so that we can quickly
/// return preexpanded tokens from MacroTokens.
void MacroExpander::ExpandFunctionArguments() {
@@ -171,11 +193,11 @@ void MacroExpander::ExpandFunctionArguments() {
assert(ArgNo != -1 && "Token following # is not an argument?");
if (CurTok.getKind() == tok::hash) // Stringify
- ResultToks.push_back(FormalArgs->getStringifiedArgument(ArgNo, PP));
+ ResultToks.push_back(ActualArgs->getStringifiedArgument(ArgNo, PP));
else {
// 'charify': don't bother caching these.
ResultToks.push_back(StringifyArgument(
- FormalArgs->getUnexpArgument(ArgNo), PP, true));
+ ActualArgs->getUnexpArgument(ArgNo), PP, true));
}
// The stringified/charified string leading space flag gets set to match
OpenPOWER on IntegriCloud