shithub: rgbds

Download patch

ref: be2572edca1eb97f5ca801d4e4380e757b04f314
parent: cf2bbe6435b643660c747a3e170b18baa20e3000
author: Rangi <[email protected]>
date: Tue Apr 20 05:37:18 EDT 2021

Track nested interpolation depth even outside string literals

Fixes #837

--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -1280,7 +1280,15 @@
 	char symName[MAXSYMLEN + 1];
 	size_t i = 0;
 	struct FormatSpec fmt = fmt_NewSpec();
+	bool disableInterpolation = lexerState->disableInterpolation;
 
+	/*
+	 * In a context where `lexerState->disableInterpolation` is true, `peek` will expand
+	 * nested interpolations itself, which can lead to stack overflow. This lets
+	 * `readInterpolation` handle its own nested expansions, increasing `depth` each time.
+	 */
+	lexerState->disableInterpolation = true;
+
 	for (;;) {
 		int c = peek();
 
@@ -1319,6 +1327,9 @@
 		i--;
 	}
 	symName[i] = '\0';
+
+	/* Don't return before `lexerState->disableInterpolation` is reset! */ 
+	lexerState->disableInterpolation = disableInterpolation;
 
 	static char buf[MAXSTRLEN + 1];
 
--- a/test/asm/nested-interpolation-recursion.asm
+++ b/test/asm/nested-interpolation-recursion.asm
@@ -1,3 +1,2 @@
-def s equs "s"
-; 65 nested {}s, recursion limit is 64
-println "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"
+; 128 nested {}s, recursion limit is 64
+{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
--- a/test/asm/nested-interpolation-recursion.err
+++ b/test/asm/nested-interpolation-recursion.err
@@ -1,2 +1,2 @@
-FATAL: nested-interpolation-recursion.asm(3):
+FATAL: nested-interpolation-recursion.asm(2):
     Recursion limit (64) exceeded