X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fcontrol%2Fdo-if.c;h=47fceee6781bbb3d158b6073ea24cfa210132315;hb=8e018d25310cb53e5339b46e95f0abe02db83782;hp=c16fca926f6702dd06e30147e24aa86883d508b2;hpb=a19b858e0ac3c69e4a28c0ca6d8674427268a863;p=pspp diff --git a/src/language/control/do-if.c b/src/language/control/do-if.c index c16fca926f..47fceee678 100644 --- a/src/language/control/do-if.c +++ b/src/language/control/do-if.c @@ -22,15 +22,17 @@ #include #include "control-stack.h" -#include -#include +#include +#include +#include #include -#include -#include #include #include +#include +#include +#include +#include #include -#include #include "gettext.h" #define _(msgid) gettext (msgid) @@ -89,6 +91,7 @@ static bool has_else (struct do_if_trns *); static bool must_not_have_else (struct do_if_trns *); static void close_do_if (void *do_if); +static trns_finalize_func do_if_finalize_func; static trns_proc_func do_if_trns_proc, break_trns_proc; static trns_free_func do_if_trns_free; @@ -101,7 +104,8 @@ cmd_do_if (void) do_if->clause_cnt = 0; ctl_stack_push (&do_if_class, do_if); - add_transformation (do_if_trns_proc, do_if_trns_free, do_if); + add_transformation_with_finalizer (do_if_finalize_func, + do_if_trns_proc, do_if_trns_free, do_if); return parse_clause (do_if); } @@ -219,6 +223,17 @@ add_clause (struct do_if_trns *do_if, clause->target_index = target_index; } +/* Finalizes DO IF by clearing the control stack, thus ensuring + that all open DO IFs are closed. */ +static void +do_if_finalize_func (void *do_if_ UNUSED) +{ + /* This will be called multiple times if multiple DO IFs were + executed, which is slightly unclean, but at least it's + idempotent. */ + ctl_stack_clear (); +} + /* DO IF transformation procedure. Checks each clause and jumps to the appropriate transformation. */