use invoke

This commit is contained in:
Folkert 2021-04-23 11:22:32 +02:00
parent 6633f8ca9f
commit 2dab9c81d1
2 changed files with 18 additions and 10 deletions

View file

@ -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?

View file

@ -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,