shithub: rgbds

Download patch

ref: 89dc14fcaf0de602acdc5ea3259a6eafee213a34
parent: 20b2f5ee2f7cfe8f100c30b6ff6236e63daf76be
parent: dfb30723819f52a2a9b5aed7ee0c49ad397c2de1
author: Eldred Habert <eldredhabert0@gmail.com>
date: Sun Sep 1 18:16:27 EDT 2019

Merge pull request #408 from ISSOtm/plumbing

Fix memory leaks with macro args

--- a/include/asm/symbol.h
+++ b/include/asm/symbol.h
@@ -63,7 +63,6 @@
 void sym_SaveCurrentMacroArgs(char *save[]);
 void sym_RestoreCurrentMacroArgs(char *save[]);
 void sym_UseNewMacroArgs(void);
-void sym_FreeCurrentMacroArgs(void);
 void sym_AddEqu(char *tzSym, int32_t value);
 void sym_AddSet(char *tzSym, int32_t value);
 void sym_Init(void);
--- a/src/asm/fstack.c
+++ b/src/asm/fstack.c
@@ -128,14 +128,10 @@
 	if (nCurrentStatus == STAT_isInclude)
 		fclose(pCurrentFile);
 
-	if (nCurrentStatus == STAT_isMacro) {
-		sym_FreeCurrentMacroArgs();
-		nLineNo += 1;
-	}
+	if (nCurrentStatus == STAT_isMacro
+	 || nCurrentStatus == STAT_isREPTBlock)
+		nLineNo++;
 
-	if (nCurrentStatus == STAT_isREPTBlock)
-		nLineNo += 1;
-
 	CurrentFlexHandle = pLastFile->FlexHandle;
 	strcpy((char *)tzCurrentFileName, (char *)pLastFile->tzFileName);
 
@@ -385,8 +381,8 @@
 void fstk_RunRept(uint32_t count)
 {
 	if (count) {
-		pushcontext();
 		sym_UseCurrentMacroArgs();
+		pushcontext();
 		sym_SetMacroArgID(nMacroCount++);
 		sym_UseNewMacroArgs();
 		nCurrentREPTBlockCount = count;
--- a/src/asm/symbol.c
+++ b/src/asm/symbol.c
@@ -69,7 +69,7 @@
 	uint32_t i = 0;
 
 	while (currentmacroargs[i] && i < MAXMACROARGS)
-		i += 1;
+		i++;
 
 	return i;
 }
@@ -360,7 +360,7 @@
 	int32_t i;
 
 	free(currentmacroargs[0]);
-	for (i = 0; i < MAXMACROARGS - 1; i += 1)
+	for (i = 0; i < MAXMACROARGS - 1; i++)
 		currentmacroargs[i] = currentmacroargs[i + 1];
 
 	currentmacroargs[MAXMACROARGS - 1] = NULL;
@@ -383,7 +383,8 @@
 {
 	int32_t i;
 
-	for (i = 0; i <= MAXMACROARGS; i += 1) {
+	for (i = 0; i <= MAXMACROARGS; i++) {
+		free(currentmacroargs[i]);
 		currentmacroargs[i] = newmacroargs[i];
 		newmacroargs[i] = NULL;
 	}
@@ -393,8 +394,10 @@
 {
 	int32_t i;
 
-	for (i = 0; i <= MAXMACROARGS; i += 1)
+	for (i = 0; i <= MAXMACROARGS; i++) {
 		save[i] = currentmacroargs[i];
+		currentmacroargs[i] = NULL;
+	}
 }
 
 void sym_RestoreCurrentMacroArgs(char *save[])
@@ -401,17 +404,9 @@
 {
 	int32_t i;
 
-	for (i = 0; i <= MAXMACROARGS; i += 1)
-		currentmacroargs[i] = save[i];
-}
-
-void sym_FreeCurrentMacroArgs(void)
-{
-	int32_t i;
-
-	for (i = 0; i <= MAXMACROARGS; i += 1) {
+	for (i = 0; i <= MAXMACROARGS; i++) {
 		free(currentmacroargs[i]);
-		currentmacroargs[i] = NULL;
+		currentmacroargs[i] = save[i];
 	}
 }
 
@@ -420,7 +415,7 @@
 	int32_t i = 0;
 
 	while (i < MAXMACROARGS && newmacroargs[i] != NULL)
-		i += 1;
+		i++;
 
 	if (i < MAXMACROARGS) {
 		if (s)
@@ -444,7 +439,7 @@
 {
 	int32_t i;
 
-	for (i = 1; i <= MAXMACROARGS; i += 1)
+	for (i = 1; i <= MAXMACROARGS; i++)
 		sym_AddNewMacroArg(sym_FindMacroArg(i));
 }
 
@@ -771,12 +766,12 @@
 	int32_t i;
 	time_t now;
 
-	for (i = 0; i < MAXMACROARGS; i += 1) {
+	for (i = 0; i < MAXMACROARGS; i++) {
 		currentmacroargs[i] = NULL;
 		newmacroargs[i] = NULL;
 	}
 
-	for (i = 0; i < HASHSIZE; i += 1)
+	for (i = 0; i < HASHSIZE; i++)
 		tHashedSymbols[i] = NULL;
 
 	sym_AddReloc("@");