shithub: rgbds

Download patch

ref: f9b48c0cad60a45625180e71ced52179b07c3d94
parent: aa76603da9a1c04835f4a431251f77d481c26bdb
author: ISSOtm <[email protected]>
date: Tue Aug 18 08:27:37 EDT 2020

Fix else working incorrectly from macros

Since the "skip ELSE blocks" variable is global, it used to get carried
over from the macro's `if` to the outer's.

--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -39,7 +39,7 @@
 char *tzNewMacro;
 uint32_t ulNewMacroSize;
 int32_t nPCOffset;
-bool executedIfBlock; /* If this is set, ELIFs cannot be executed anymore */
+bool executeElseBlock; /* If this is set, ELIFs cannot be executed anymore */
 
 static uint32_t str2int2(uint8_t *s, int32_t length)
 {
@@ -360,8 +360,8 @@
 
 if		: T_POP_IF const '\n' {
 			nIFDepth++;
-			executedIfBlock = !!$2;
-			if (!executedIfBlock)
+			executeElseBlock = !$2;
+			if (executeElseBlock)
 				lexer_SetMode(LEXER_SKIP_TO_ELIF);
 		}
 ;
@@ -370,11 +370,11 @@
 			if (nIFDepth <= 0)
 				fatalerror("Found ELIF outside an IF construct\n");
 
-			if (executedIfBlock) {
+			if (!executeElseBlock) {
 				lexer_SetMode(LEXER_SKIP_TO_ENDC);
 			} else {
-				executedIfBlock = !!$2;
-				if (!executedIfBlock)
+				executeElseBlock = !$2;
+				if (executeElseBlock)
 					lexer_SetMode(LEXER_SKIP_TO_ELIF);
 			}
 		}
@@ -384,7 +384,7 @@
 			if (nIFDepth <= 0)
 				fatalerror("Found ELSE outside an IF construct\n");
 
-			if (executedIfBlock)
+			if (!executeElseBlock)
 				lexer_SetMode(LEXER_SKIP_TO_ENDC);
 		}
 ;
@@ -394,6 +394,7 @@
 				fatalerror("Found ENDC outside an IF construct\n");
 
 			nIFDepth--;
+			executeElseBlock = false;
 		}
 ;
 
--- /dev/null
+++ b/test/asm/if-macro.asm
@@ -1,0 +1,13 @@
+m: macro
+	if 0
+		WARN "3"
+	else
+		WARN "5"
+	endc
+endm
+
+if 1
+	m
+else
+	WARN "12"
+endc
--- /dev/null
+++ b/test/asm/if-macro.err
@@ -1,0 +1,2 @@
+warning: if-macro.asm(10) -> if-macro.asm::m(5): [-Wuser]
+    5