Fix control flow bug
This commit is contained in:
parent
05c27a581e
commit
1df621868f
@ -111,6 +111,7 @@ fn eval_markup(
|
||||
scp: &mut Scopes,
|
||||
nodes: &mut impl Iterator<Item = MarkupNode>,
|
||||
) -> TypResult<Content> {
|
||||
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<Item = Expr>,
|
||||
) -> TypResult<Value> {
|
||||
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<Self::Output> {
|
||||
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<Self::Output> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 7.1 KiB |
@ -134,3 +134,14 @@
|
||||
set text(blue, ..break)
|
||||
[Not happening]
|
||||
}
|
||||
|
||||
---
|
||||
// Test second block during break flow.
|
||||
// Ref: true
|
||||
|
||||
#for i in range(10) {
|
||||
table(
|
||||
{ [A]; break },
|
||||
for _ in range(3) [B]
|
||||
)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user