From d983b6223304fb9bca16c20df0d5349605f25541 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Mon, 7 Oct 2019 21:19:32 -0700 Subject: [PATCH] preproc: make %exitrep do what it is supposed to %exitrep should should stop emitting code immediately, not just terminate the loop when we hit %endrep. There is a bunch of hacky code that special-cases that using istk->in_progress == 0. The handling of the tail of %exitrep, %include and non-emitting conditionals using entirely different mechanisms is just dumb. They need to be unified. Link: https://bugzilla.nasm.us/show_bug.cgi?id=3392612 Reported-by: Jason Hood Signed-off-by: H. Peter Anvin --- asm/preproc.c | 2 +- test/exitrep.asm | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/exitrep.asm diff --git a/asm/preproc.c b/asm/preproc.c index 790cf73c..3ee36c10 100644 --- a/asm/preproc.c +++ b/asm/preproc.c @@ -3986,7 +3986,7 @@ issue_error: break; if (l) - l->finishes->in_progress = 1; + l->finishes->in_progress = 0; else nasm_nonfatal("`%%exitrep' not within `%%rep' block"); break; diff --git a/test/exitrep.asm b/test/exitrep.asm new file mode 100644 index 00000000..3be87055 --- /dev/null +++ b/test/exitrep.asm @@ -0,0 +1,16 @@ +%macro testrep 0.nolist + %assign i 1 + %rep 4 + mov eax,i + %if i==3 + %exitrep + %endif + mov ebx,i + %ifn i < 3 + %error iteration i should not be seen + %endif + %assign i i+1 + %endrep +%endmacro + +testrep