1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//! Return value from a `CodeObject`
//!
//! Every `CodeObject` implicitly returns `Nil` if no return value was given.

use super::*;

/// Return value from a `CodeObject`
#[derive(Clone)]
pub struct Return {
    expr: Expr,
}

impl Return {
    pub fn nil() -> Self {
        Self {
            expr: Value::Nil.into(),
        }
    }

    pub fn value<T>(expr: T) -> Self
    where
        T: Into<Expr>,
    {
        Self { expr: expr.into() }
    }
}

impl HirLowering for Return {
    fn lower<'hir, 'lir>(&'hir self, runtime: &mut HirLoweringRuntime<'lir>)
    where
        'hir: 'lir,
    {
        self.expr.lower(runtime);
        runtime.emit(LirElement::Ret);
    }
}