mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 15:21:12 +00:00
use invoke
This commit is contained in:
parent
6633f8ca9f
commit
2dab9c81d1
2 changed files with 18 additions and 10 deletions
|
@ -728,7 +728,13 @@ impl<'a> Context<'a> {
|
||||||
|
|
||||||
// the result of an invoke should not be touched in the fail branch
|
// the result of an invoke should not be touched in the fail branch
|
||||||
// but it should be present in the pass branch (otherwise it would be dead)
|
// but it should be present in the pass branch (otherwise it would be dead)
|
||||||
debug_assert!(case_live_vars.contains(symbol));
|
// NOTE: we cheat a bit here to allow `invoke` when generating code for `expect`
|
||||||
|
let is_dead = !case_live_vars.contains(symbol);
|
||||||
|
|
||||||
|
if is_dead && layout.is_refcounted() {
|
||||||
|
panic!("A variable of a reference-counted layout is dead; that's a bug!");
|
||||||
|
}
|
||||||
|
|
||||||
case_live_vars.remove(symbol);
|
case_live_vars.remove(symbol);
|
||||||
|
|
||||||
let fail = {
|
let fail = {
|
||||||
|
@ -738,7 +744,9 @@ impl<'a> Context<'a> {
|
||||||
ctx.add_dec_for_alt(&case_live_vars, &alt_live_vars, b)
|
ctx.add_dec_for_alt(&case_live_vars, &alt_live_vars, b)
|
||||||
};
|
};
|
||||||
|
|
||||||
case_live_vars.insert(*symbol);
|
if !is_dead {
|
||||||
|
case_live_vars.insert(*symbol);
|
||||||
|
}
|
||||||
|
|
||||||
let pass = {
|
let pass = {
|
||||||
// TODO should we use ctor info like Lean?
|
// TODO should we use ctor info like Lean?
|
||||||
|
|
|
@ -3260,7 +3260,7 @@ pub fn with_hole<'a>(
|
||||||
|
|
||||||
EmptyRecord => Stmt::Let(assigned, Expr::Struct(&[]), Layout::Struct(&[]), hole),
|
EmptyRecord => Stmt::Let(assigned, Expr::Struct(&[]), Layout::Struct(&[]), hole),
|
||||||
|
|
||||||
Expect(_, rest) => todo!(),
|
Expect(_, _) => unreachable!("I think this is unreachable"),
|
||||||
|
|
||||||
If {
|
If {
|
||||||
cond_var,
|
cond_var,
|
||||||
|
@ -4307,14 +4307,14 @@ pub fn from_can<'a>(
|
||||||
call_type,
|
call_type,
|
||||||
arguments,
|
arguments,
|
||||||
};
|
};
|
||||||
let test = Expr::Call(call);
|
|
||||||
|
|
||||||
let rest = Stmt::Let(
|
let rest = Stmt::Invoke {
|
||||||
env.unique_symbol(),
|
symbol: env.unique_symbol(),
|
||||||
test,
|
call,
|
||||||
bool_layout,
|
layout: bool_layout,
|
||||||
env.arena.alloc(rest),
|
pass: env.arena.alloc(rest),
|
||||||
);
|
fail: env.arena.alloc(Stmt::Rethrow),
|
||||||
|
};
|
||||||
|
|
||||||
with_hole(
|
with_hole(
|
||||||
env,
|
env,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue