From 1df621868fda1aae193405057f69c3187debbae2 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 13 May 2022 16:39:41 +0200 Subject: [PATCH] Fix control flow bug --- src/eval/mod.rs | 31 +++++++++++++++++++++++++----- tests/ref/code/break-continue.png | Bin 5885 -> 7268 bytes tests/typ/code/break-continue.typ | 11 +++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/eval/mod.rs b/src/eval/mod.rs index d39c3c2c3..b35cf1ef9 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -111,6 +111,7 @@ fn eval_markup( scp: &mut Scopes, nodes: &mut impl Iterator, ) -> TypResult { + let flow = ctx.flow.take(); let mut seq = Vec::with_capacity(nodes.size_hint().1.unwrap_or_default()); while let Some(node) = nodes.next() { @@ -146,6 +147,10 @@ fn eval_markup( } } + if flow.is_some() { + ctx.flow = flow; + } + Ok(Content::sequence(seq)) } @@ -343,6 +348,7 @@ fn eval_code( scp: &mut Scopes, exprs: &mut impl Iterator, ) -> TypResult { + let flow = ctx.flow.take(); let mut output = Value::None; while let Some(expr) = exprs.next() { @@ -383,6 +389,10 @@ fn eval_code( } } + if flow.is_some() { + ctx.flow = flow; + } + Ok(output) } @@ -785,6 +795,7 @@ impl Eval for WhileExpr { type Output = Value; fn eval(&self, ctx: &mut Context, scp: &mut Scopes) -> TypResult { + let flow = ctx.flow.take(); let mut output = Value::None; let condition = self.condition(); @@ -804,6 +815,10 @@ impl Eval for WhileExpr { } } + if flow.is_some() { + ctx.flow = flow; + } + Ok(output) } } @@ -812,11 +827,12 @@ impl Eval for ForExpr { type Output = Value; fn eval(&self, ctx: &mut Context, scp: &mut Scopes) -> TypResult { + let flow = ctx.flow.take(); + let mut output = Value::None; + scp.enter(); + macro_rules! iter { (for ($($binding:ident => $value:ident),*) in $iter:expr) => {{ - let mut output = Value::None; - scp.enter(); - #[allow(unused_parens)] for ($($value),*) in $iter { $(scp.top.def_mut(&$binding, $value);)* @@ -836,8 +852,6 @@ impl Eval for ForExpr { } } - scp.exit(); - return Ok(output); }}; } @@ -878,6 +892,13 @@ impl Eval for ForExpr { bail!(self.iter().span(), "cannot loop over {}", iter.type_name()); } } + + if flow.is_some() { + ctx.flow = flow; + } + + scp.exit(); + Ok(output) } } diff --git a/tests/ref/code/break-continue.png b/tests/ref/code/break-continue.png index 848f4fa60acff7bfad46b6326ec8395ea8873c76..401b39409e2aa4f21cda5984c43021757f2d3160 100644 GIT binary patch literal 7268 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 YN{NdtAy8q~)&Ja7l2?~2kTHGnU#P#86aWAK literal 5885 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