PP, nonfunctional: Properly encapsulate a TokenStream.
This commit is contained in:
parent
b49bb2ca5c
commit
9a2733a978
3 changed files with 91 additions and 95 deletions
|
|
@ -148,10 +148,10 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
|
|||
// record the definition of the macro
|
||||
TSourceLoc defineLoc = ppToken->loc; // because ppToken is going to go to the next line before we report errors
|
||||
while (token != '\n' && token != EndOfInput) {
|
||||
RecordToken(mac.body, token, ppToken);
|
||||
mac.body.putToken(token, ppToken);
|
||||
token = scanToken(ppToken);
|
||||
if (token != '\n' && ppToken->space)
|
||||
RecordToken(mac.body, ' ', ppToken);
|
||||
mac.body.putToken(' ', ppToken);
|
||||
}
|
||||
|
||||
// check for duplicate definition
|
||||
|
|
@ -166,15 +166,15 @@ int TPpContext::CPPdefine(TPpToken* ppToken)
|
|||
else {
|
||||
if (existing->args != mac.args)
|
||||
parseContext.ppError(defineLoc, "Macro redefined; different argument names:", "#define", atomStrings.getString(defAtom));
|
||||
RewindTokenStream(existing->body);
|
||||
RewindTokenStream(mac.body);
|
||||
existing->body.reset();
|
||||
mac.body.reset();
|
||||
int newToken;
|
||||
do {
|
||||
int oldToken;
|
||||
TPpToken oldPpToken;
|
||||
TPpToken newPpToken;
|
||||
oldToken = ReadToken(existing->body, &oldPpToken);
|
||||
newToken = ReadToken(mac.body, &newPpToken);
|
||||
oldToken = existing->body.getToken(parseContext, &oldPpToken);
|
||||
newToken = mac.body.getToken(parseContext, &newPpToken);
|
||||
if (oldToken != newToken || oldPpToken != newPpToken) {
|
||||
parseContext.ppError(defineLoc, "Macro redefined; different substitutions:", "#define", atomStrings.getString(defAtom));
|
||||
break;
|
||||
|
|
@ -988,7 +988,7 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken*
|
|||
token = tokenPaste(token, *ppToken);
|
||||
if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
|
||||
continue;
|
||||
RecordToken(*expandedArg, token, ppToken);
|
||||
expandedArg->putToken(token, ppToken);
|
||||
}
|
||||
|
||||
if (token == EndOfInput) {
|
||||
|
|
@ -1011,7 +1011,7 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken)
|
|||
{
|
||||
int token;
|
||||
do {
|
||||
token = pp->ReadToken(mac->body, ppToken);
|
||||
token = mac->body.getToken(pp->parseContext, ppToken);
|
||||
} while (token == ' '); // handle white space in macro
|
||||
|
||||
// Hash operators basically turn off a round of macro substitution
|
||||
|
|
@ -1042,7 +1042,7 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken)
|
|||
}
|
||||
|
||||
// see if are preceding a ##
|
||||
if (peekMacPasting()) {
|
||||
if (mac->body.peekUntokenizedPasting()) {
|
||||
prepaste = true;
|
||||
pasting = true;
|
||||
}
|
||||
|
|
@ -1069,31 +1069,6 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken)
|
|||
return token;
|
||||
}
|
||||
|
||||
// See if the next non-white-space token in the macro is ##
|
||||
bool TPpContext::tMacroInput::peekMacPasting()
|
||||
{
|
||||
// don't return early, have to restore this
|
||||
size_t savePos = mac->body.current;
|
||||
|
||||
// skip white-space
|
||||
int subtoken;
|
||||
do {
|
||||
subtoken = pp->getSubtoken(mac->body);
|
||||
} while (subtoken == ' ');
|
||||
|
||||
// check for ##
|
||||
bool pasting = false;
|
||||
if (subtoken == '#') {
|
||||
subtoken = pp->getSubtoken(mac->body);
|
||||
if (subtoken == '#')
|
||||
pasting = true;
|
||||
}
|
||||
|
||||
mac->body.current = savePos;
|
||||
|
||||
return pasting;
|
||||
}
|
||||
|
||||
// return a textual zero, for scanning a macro that was never defined
|
||||
int TPpContext::tZeroInput::scan(TPpToken* ppToken)
|
||||
{
|
||||
|
|
@ -1218,7 +1193,7 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka
|
|||
depth++;
|
||||
if (token == ')')
|
||||
depth--;
|
||||
RecordToken(*in->args[arg], token, ppToken);
|
||||
in->args[arg]->putToken(token, ppToken);
|
||||
tokenRecorded = true;
|
||||
}
|
||||
if (token == ')') {
|
||||
|
|
@ -1258,7 +1233,7 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka
|
|||
|
||||
pushInput(in);
|
||||
macro->busy = 1;
|
||||
RewindTokenStream(macro->body);
|
||||
macro->body.reset();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue