preproc: don't handle %+ until the final phase of smacro expansion

Revert to the earlier behavior of not expanding %+ until the final
phase of smacro expansion.  However, the previous code has:

    if (expanded && paste_tokens(&thead, true)) {

... which would inhibit paste_tokens() if expanded was false on the
first iteration.  However, if expand_mmac_params is not expanding %+,
then we cannot bypass this expansion.  Thus use:

    pasted = paste_tokens(&thead, true);
    if (expanded && pasted) {

... instead.

This seems to work with both Syslinux and x264 usage, and therefore
hopefully should be compatible with earlier versions of NASM.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin 2009-07-06 18:48:23 -07:00
parent 740df43005
commit fc30f8c736

View File

@ -3611,7 +3611,7 @@ static Token *expand_mmac_params(Token * tline)
*tail = NULL;
if (changed)
paste_tokens(&thead, true);
paste_tokens(&thead, false);
return thead;
}
@ -3638,7 +3638,7 @@ static Token *expand_smacro(Token * tline)
Context *ctx;
const char *mname;
int deadman = DEADMAN_LIMIT;
bool expanded;
bool expanded, pasted;
/*
* Trick: we should avoid changing the start token pointer since it can
@ -3928,8 +3928,12 @@ again:
* Also we look for %+ tokens and concatenate the tokens before and after
* them (without white spaces in between).
*/
if (expanded && paste_tokens(&thead, true)) {
/* If we concatenated something, re-scan the line for macros */
pasted = paste_tokens(&thead, true);
if (expanded && pasted) {
/*
* If we concatenated something, *and* we had previously expanded
* an actual macro, scan the lines again for macros...
*/
tline = thead;
goto again;
}