@@ -301,21 +301,26 @@ sub parse_if_line {
# evaluate .if blocks
if (scalar(@ifstack)) {
- if ($line =~ /\.endif/) {
- pop(@ifstack);
- return 1;
- } elsif ($line =~ /\.elseif\s+(.*)/) {
- if ($ifstack[-1] == 0) {
- $ifstack[-1] = !!eval_expr($1);
- } elsif ($ifstack[-1] > 0) {
- $ifstack[-1] = -$ifstack[-1];
+ # Don't evaluate any new if statements if we're within
+ # a repetition or macro - they will be evaluated once
+ # the repetition is unrolled or the macro is expanded.
+ if (scalar(@rept_lines) == 0 and $macro_level == 0) {
+ if ($line =~ /\.endif/) {
+ pop(@ifstack);
+ return 1;
+ } elsif ($line =~ /\.elseif\s+(.*)/) {
+ if ($ifstack[-1] == 0) {
+ $ifstack[-1] = !!eval_expr($1);
+ } elsif ($ifstack[-1] > 0) {
+ $ifstack[-1] = -$ifstack[-1];
+ }
+ return 1;
+ } elsif ($line =~ /\.else/) {
+ $ifstack[-1] = !$ifstack[-1];
+ return 1;
+ } elsif (handle_if($line)) {
+ return 1;
}
- return 1;
- } elsif ($line =~ /\.else/) {
- $ifstack[-1] = !$ifstack[-1];
- return 1;
- } elsif (handle_if($line)) {
- return 1;
}
# discard lines in false .if blocks
@@ -30,3 +30,21 @@ m 0
.irpc i, 01
m \i
.endr
+
+.macro outer
+ .macro inner
+ .if VAR1 > 10
+ mov r4, #42
+ .endif
+ .endm
+
+ .set VAR1, 5
+ inner
+ .set VAR1, 15
+ inner
+ .purgem inner
+.endm
+
+.if 2 > 1
+ outer
+.endif