Fix for bug that happened when a called macro inside an if/endif block would have...
authorggn <ggn.dbug@gmail.com>
Fri, 30 Oct 2015 17:30:21 +0000 (19:30 +0200)
committerShamus Hammons <jlhamm@acm.org>
Sun, 1 Nov 2015 14:24:05 +0000 (08:24 -0600)
macro.c
token.c

diff --git a/macro.c b/macro.c
index e7d51dd0ba5e76ff9982de4d4f541e4735e72796..0807e74b033f38080fd0ceb2ad4b21bcf3c00f4a 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -80,8 +80,7 @@ of another (nested macros). Need to fix that somehow.
        argp -= imacro->im_nargs;
        DEBUG printf("%d (nargs = %d)\n", argp, imacro->im_nargs);
 
-       fpop();
-       return 0;
+       return fpop();
 }
 
 
diff --git a/token.c b/token.c
index cc754ab88e65e2f683977a09b44a24f8ba624e38..c78d97ac6f0054d8ca02bf68b0a3a1c0c10406e4 100644 (file)
--- a/token.c
+++ b/token.c
@@ -728,7 +728,10 @@ int fpop(void)
                // Pop IFENT levels until we reach the conditional assembly context we
                // were at when the input object was entered.
                while (ifent != inobj->in_ifent)
-                       d_endif();
+               {
+                       if (d_endif() != 0)                             // Something bad happened during endif parsing?
+                               return -1;                                      // If yes, bail instead of getting stuck in a loop
+               }
 
                tok = inobj->in_otok;                           // Restore tok and otok
                etok = inobj->in_etok;
@@ -940,8 +943,10 @@ if (verb_flag) printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n");
        case SRC_IMACRO:
                if ((ln = GetNextMacroLine()) == NULL)
                {
-                       ExitMacro();                                    // Exit macro (pop args, do fpop(), etc)
-                       goto retry;                                             // Try for more lines...
+                       if (ExitMacro() == 0)                   // Exit macro (pop args, do fpop(), etc)
+                               goto retry;                                     // Try for more lines...
+                       else
+                               return TKEOF;                           // Oops, we got a non zero return code, signal EOF
                }
 
                lntag = '@';