Use std::string for FOR loop variables

This commit is contained in:
Rangi42
2024-02-27 19:21:30 -05:00
committed by Sylvie
parent 48b2e94aa3
commit 0bed84174b

View File

@@ -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;