mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
@@ -800,7 +800,7 @@ static int peekInternal(uint8_t distance)
|
|||||||
|
|
||||||
/* forward declarations for peek */
|
/* forward declarations for peek */
|
||||||
static void shiftChar(void);
|
static void shiftChar(void);
|
||||||
static char const *readInterpolation(void);
|
static char const *readInterpolation(unsigned int depth);
|
||||||
|
|
||||||
static int peek(void)
|
static int peek(void)
|
||||||
{
|
{
|
||||||
@@ -845,7 +845,7 @@ restart:
|
|||||||
} else if (c == '{' && !lexerState->disableInterpolation) {
|
} else if (c == '{' && !lexerState->disableInterpolation) {
|
||||||
/* If character is an open brace, do symbol interpolation */
|
/* If character is an open brace, do symbol interpolation */
|
||||||
shiftChar();
|
shiftChar();
|
||||||
char const *ptr = readInterpolation();
|
char const *ptr = readInterpolation(0);
|
||||||
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
beginExpansion(ptr, false, ptr);
|
beginExpansion(ptr, false, ptr);
|
||||||
@@ -1258,8 +1258,11 @@ static int readIdentifier(char firstChar)
|
|||||||
|
|
||||||
/* Functions to read strings */
|
/* Functions to read strings */
|
||||||
|
|
||||||
static char const *readInterpolation(void)
|
static char const *readInterpolation(unsigned int depth)
|
||||||
{
|
{
|
||||||
|
if (depth >= nMaxRecursionDepth)
|
||||||
|
fatalerror("Recursion limit (%zu) exceeded\n", nMaxRecursionDepth);
|
||||||
|
|
||||||
char symName[MAXSYMLEN + 1];
|
char symName[MAXSYMLEN + 1];
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
struct FormatSpec fmt = fmt_NewSpec();
|
struct FormatSpec fmt = fmt_NewSpec();
|
||||||
@@ -1269,7 +1272,7 @@ static char const *readInterpolation(void)
|
|||||||
|
|
||||||
if (c == '{') { /* Nested interpolation */
|
if (c == '{') { /* Nested interpolation */
|
||||||
shiftChar();
|
shiftChar();
|
||||||
char const *ptr = readInterpolation();
|
char const *ptr = readInterpolation(depth + 1);
|
||||||
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
beginExpansion(ptr, false, ptr);
|
beginExpansion(ptr, false, ptr);
|
||||||
@@ -1491,7 +1494,7 @@ static void readString(void)
|
|||||||
// We'll be exiting the string scope, so re-enable expansions
|
// We'll be exiting the string scope, so re-enable expansions
|
||||||
// (Not interpolations, since they're handled by the function itself...)
|
// (Not interpolations, since they're handled by the function itself...)
|
||||||
lexerState->disableMacroArgs = false;
|
lexerState->disableMacroArgs = false;
|
||||||
char const *ptr = readInterpolation();
|
char const *ptr = readInterpolation(0);
|
||||||
|
|
||||||
if (ptr)
|
if (ptr)
|
||||||
while (*ptr)
|
while (*ptr)
|
||||||
@@ -1641,7 +1644,7 @@ static size_t appendStringLiteral(size_t i)
|
|||||||
// We'll be exiting the string scope, so re-enable expansions
|
// We'll be exiting the string scope, so re-enable expansions
|
||||||
// (Not interpolations, since they're handled by the function itself...)
|
// (Not interpolations, since they're handled by the function itself...)
|
||||||
lexerState->disableMacroArgs = false;
|
lexerState->disableMacroArgs = false;
|
||||||
char const *ptr = readInterpolation();
|
char const *ptr = readInterpolation(0);
|
||||||
|
|
||||||
if (ptr)
|
if (ptr)
|
||||||
i = appendEscapedSubstring(ptr, i);
|
i = appendEscapedSubstring(ptr, i);
|
||||||
|
|||||||
6
test/asm/interpolation-recursion.asm
Normal file
6
test/asm/interpolation-recursion.asm
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
recurse EQUS "\{recurse\} "
|
||||||
|
{recurse}
|
||||||
|
|
||||||
|
; FIXME: also handle the following:
|
||||||
|
; recurse EQUS "\{recurse\}"
|
||||||
|
; {recurse}
|
||||||
67
test/asm/interpolation-recursion.err
Normal file
67
test/asm/interpolation-recursion.err
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
FATAL: interpolation-recursion.asm(2):
|
||||||
|
Recursion limit (64) exceeded
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
|
while expanding symbol "{recurse} "
|
||||||
0
test/asm/interpolation-recursion.out
Normal file
0
test/asm/interpolation-recursion.out
Normal file
3
test/asm/nested-interpolation-recursion.asm
Normal file
3
test/asm/nested-interpolation-recursion.asm
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
def s equs "s"
|
||||||
|
; 65 nested {}s, recursion limit is 64
|
||||||
|
println "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"
|
||||||
2
test/asm/nested-interpolation-recursion.err
Normal file
2
test/asm/nested-interpolation-recursion.err
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
FATAL: nested-interpolation-recursion.asm(3):
|
||||||
|
Recursion limit (64) exceeded
|
||||||
0
test/asm/nested-interpolation-recursion.out
Normal file
0
test/asm/nested-interpolation-recursion.out
Normal file
Reference in New Issue
Block a user