mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Use std::string for FOR loop variables
This commit is contained in:
@@ -28,9 +28,10 @@ struct Context {
|
|||||||
uint32_t uniqueID;
|
uint32_t uniqueID;
|
||||||
struct MacroArgs *macroArgs; // Macro args are *saved* here
|
struct MacroArgs *macroArgs; // Macro args are *saved* here
|
||||||
uint32_t nbReptIters;
|
uint32_t nbReptIters;
|
||||||
|
bool isForLoop;
|
||||||
int32_t forValue;
|
int32_t forValue;
|
||||||
int32_t forStep;
|
int32_t forStep;
|
||||||
char *forName;
|
std::string forName;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::stack<struct Context> contextStack;
|
static std::stack<struct Context> contextStack;
|
||||||
@@ -214,11 +215,11 @@ bool yywrap(void)
|
|||||||
std::vector<uint32_t> &fileInfoIters = context.fileInfo->iters();
|
std::vector<uint32_t> &fileInfoIters = context.fileInfo->iters();
|
||||||
|
|
||||||
// If this is a FOR, update the symbol value
|
// If this is a FOR, update the symbol value
|
||||||
if (context.forName && fileInfoIters.front() <= context.nbReptIters) {
|
if (context.isForLoop && fileInfoIters.front() <= context.nbReptIters) {
|
||||||
// Avoid arithmetic overflow runtime error
|
// Avoid arithmetic overflow runtime error
|
||||||
uint32_t forValue = (uint32_t)context.forValue + (uint32_t)context.forStep;
|
uint32_t forValue = (uint32_t)context.forValue + (uint32_t)context.forStep;
|
||||||
context.forValue = forValue <= INT32_MAX ? forValue : -(int32_t)~forValue - 1;
|
context.forValue = forValue <= INT32_MAX ? forValue : -(int32_t)~forValue - 1;
|
||||||
struct Symbol *sym = sym_AddVar(context.forName, context.forValue);
|
struct Symbol *sym = sym_AddVar(context.forName.c_str(), context.forValue);
|
||||||
|
|
||||||
// This error message will refer to the current iteration
|
// This error message will refer to the current iteration
|
||||||
if (sym->type != SYM_VAR)
|
if (sym->type != SYM_VAR)
|
||||||
@@ -249,8 +250,6 @@ bool yywrap(void)
|
|||||||
// Free the file stack node
|
// Free the file stack node
|
||||||
if (!oldContext.fileInfo->referenced)
|
if (!oldContext.fileInfo->referenced)
|
||||||
delete oldContext.fileInfo;
|
delete oldContext.fileInfo;
|
||||||
// Free the FOR symbol name
|
|
||||||
free(oldContext.forName);
|
|
||||||
|
|
||||||
lexer_SetState(&contextStack.top().lexerState);
|
lexer_SetState(&contextStack.top().lexerState);
|
||||||
macro_SetUniqueID(contextStack.top().uniqueID);
|
macro_SetUniqueID(contextStack.top().uniqueID);
|
||||||
@@ -278,7 +277,7 @@ static struct Context &newContext(struct FileStackNode *fileInfo)
|
|||||||
struct Context &context = contextStack.emplace();
|
struct Context &context = contextStack.emplace();
|
||||||
|
|
||||||
context.fileInfo = fileInfo;
|
context.fileInfo = fileInfo;
|
||||||
context.forName = NULL;
|
context.isForLoop = false;
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
@@ -447,7 +446,6 @@ void fstk_RunRept(uint32_t count, int32_t reptLineNo, char *body, size_t size)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
contextStack.top().nbReptIters = count;
|
contextStack.top().nbReptIters = count;
|
||||||
contextStack.top().forName = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step,
|
void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step,
|
||||||
@@ -479,11 +477,10 @@ void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step,
|
|||||||
struct Context &context = contextStack.top();
|
struct Context &context = contextStack.top();
|
||||||
|
|
||||||
context.nbReptIters = count;
|
context.nbReptIters = count;
|
||||||
|
context.isForLoop = true;
|
||||||
context.forValue = start;
|
context.forValue = start;
|
||||||
context.forStep = step;
|
context.forStep = step;
|
||||||
context.forName = strdup(symName);
|
context.forName = symName;
|
||||||
if (!context.forName)
|
|
||||||
fatalerror("Not enough memory for FOR symbol name: %s\n", strerror(errno));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fstk_StopRept(void)
|
void fstk_StopRept(void)
|
||||||
@@ -534,7 +531,7 @@ void fstk_Init(char const *mainPath, size_t maxDepth)
|
|||||||
context.nbReptIters = 0;
|
context.nbReptIters = 0;
|
||||||
context.forValue = 0;
|
context.forValue = 0;
|
||||||
context.forStep = 0;
|
context.forStep = 0;
|
||||||
context.forName = NULL;
|
context.isForLoop = false;
|
||||||
|
|
||||||
maxRecursionDepth = maxDepth;
|
maxRecursionDepth = maxDepth;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user