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