diff --git a/include/asm/fstack.h b/include/asm/fstack.h index 39dbc51b..97a474e1 100644 --- a/include/asm/fstack.h +++ b/include/asm/fstack.h @@ -48,6 +48,7 @@ struct FileStackNamedNode { /* NODE_FILE, NODE_MACRO */ char name[]; /* File name for files, file::macro name for macros */ }; +#define DEFAULT_MAX_DEPTH 64 extern size_t maxRecursionDepth; struct MacroArgs; diff --git a/man/rgbasm.1 b/man/rgbasm.1 index f12e9dbf..84a26185 100644 --- a/man/rgbasm.1 +++ b/man/rgbasm.1 @@ -131,7 +131,8 @@ Write an object file to the given filename. When padding an image, pad with this value. The default is 0x00. .It Fl r Ar recursion_depth , Fl Fl recursion-depth Ar recursion_depth -Specifies the recursion depth at which RGBASM will assume being in an infinite loop. +Specifies the recursion depth past which RGBASM will assume being in an infinite loop. +The default is 64. .It Fl V , Fl Fl version Print the version of the program and exit. .It Fl v , Fl Fl verbose diff --git a/src/asm/fstack.c b/src/asm/fstack.c index ceb81190..b118cd81 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -37,7 +37,6 @@ struct Context { static struct Context *contextStack; static size_t contextDepth = 0; -#define DEFAULT_MAX_DEPTH 64 size_t maxRecursionDepth; static unsigned int nbIncPaths = 0; @@ -510,7 +509,7 @@ bool fstk_Break(void) void fstk_NewRecursionDepth(size_t newDepth) { - if (contextDepth >= newDepth) + if (contextDepth > newDepth) fatalerror("Recursion limit (%zu) exceeded\n", newDepth); maxRecursionDepth = newDepth; } diff --git a/src/asm/lexer.c b/src/asm/lexer.c index ea45d946..6881029b 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -688,7 +688,7 @@ void lexer_CheckRecursionDepth(void) size_t depth = 0; for (struct Expansion *exp = lexerState->expansions; exp; exp = exp->parent) { - if (depth++ >= maxRecursionDepth) + if (depth++ > maxRecursionDepth) fatalerror("Recursion limit (%zu) exceeded\n", maxRecursionDepth); } } @@ -1336,7 +1336,7 @@ static int readIdentifier(char firstChar) static char const *readInterpolation(size_t depth) { - if (depth >= maxRecursionDepth) + if (depth > maxRecursionDepth) fatalerror("Recursion limit (%zu) exceeded\n", maxRecursionDepth); char symName[MAXSYMLEN + 1]; diff --git a/src/asm/main.c b/src/asm/main.c index 3ee1e82f..8091a544 100644 --- a/src/asm/main.c +++ b/src/asm/main.c @@ -181,7 +181,7 @@ int main(int argc, char *argv[]) verbose = false; warnings = true; sym_SetExportAll(false); - uint32_t maxDepth = 64; + uint32_t maxDepth = DEFAULT_MAX_DEPTH; size_t targetFileNameLen = 0; while ((ch = musl_getopt_long_only(argc, argv, optstring, longopts, NULL)) != -1) { diff --git a/test/asm/equs-recursion.err b/test/asm/equs-recursion.err index 002d0490..42124e0e 100644 --- a/test/asm/equs-recursion.err +++ b/test/asm/equs-recursion.err @@ -65,3 +65,4 @@ while expanding symbol "recurse" while expanding symbol "recurse" while expanding symbol "recurse" while expanding symbol "recurse" +while expanding symbol "recurse" diff --git a/test/asm/include-recursion.err b/test/asm/include-recursion.err index 1d598df3..6bca0180 100644 --- a/test/asm/include-recursion.err +++ b/test/asm/include-recursion.err @@ -1,2 +1,2 @@ -FATAL: include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1): +FATAL: include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1): Recursion limit (64) exceeded diff --git a/test/asm/interpolation-recursion.err b/test/asm/interpolation-recursion.err index 50fd075e..5f3c7a25 100644 --- a/test/asm/interpolation-recursion.err +++ b/test/asm/interpolation-recursion.err @@ -65,3 +65,4 @@ while expanding symbol "{recurse}" while expanding symbol "{recurse}" while expanding symbol "{recurse}" while expanding symbol "{recurse}" +while expanding symbol "{recurse}" diff --git a/test/asm/macro-recursion.err b/test/asm/macro-recursion.err index d515ed61..4843de7f 100644 --- a/test/asm/macro-recursion.err +++ b/test/asm/macro-recursion.err @@ -1,2 +1,2 @@ -FATAL: macro-recursion.asm(4) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2): +FATAL: macro-recursion.asm(4) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2): Recursion limit (64) exceeded diff --git a/test/asm/opt-r.asm b/test/asm/opt-r.asm index 1889f913..bec984ee 100644 --- a/test/asm/opt-r.asm +++ b/test/asm/opt-r.asm @@ -6,7 +6,7 @@ OPT r ; Missing arg OPT r 2a ; Bad decimal ; Check that it has an effect -OPT r 1 +OPT r 0 MACRO m m ENDM diff --git a/test/asm/opt-r.err b/test/asm/opt-r.err index 9fbd09ff..0d06b4f8 100644 --- a/test/asm/opt-r.err +++ b/test/asm/opt-r.err @@ -3,4 +3,4 @@ error: opt-r.asm(5): error: opt-r.asm(6): Invalid argument to option 'r' ("2a") FATAL: opt-r.asm(13): - Recursion limit (1) exceeded + Recursion limit (0) exceeded