Skip to main content

lovm2_core/gen/hir/
conv.rs

1//! Do type conversion on a lowered `Expr` at runtime
2
3use super::*;
4
5use crate::value::ValueType;
6
7/// Do type conversion on a lowered `Expr` at runtime
8#[derive(Clone, Debug)]
9pub struct Conv {
10    ty: ValueType,
11    expr: Box<Expr>,
12}
13
14impl Conv {
15    fn new(ty: ValueType, expr: Expr) -> Self {
16        Self {
17            ty,
18            expr: Box::new(expr),
19        }
20    }
21
22    pub fn to_bool<T>(expr: T) -> Self
23    where
24        T: Into<Expr>,
25    {
26        Self::new(ValueType::Bool, expr.into())
27    }
28
29    pub fn to_float<T>(expr: T) -> Self
30    where
31        T: Into<Expr>,
32    {
33        Self::new(ValueType::Float, expr.into())
34    }
35
36    pub fn to_integer<T>(expr: T) -> Self
37    where
38        T: Into<Expr>,
39    {
40        Self::new(ValueType::Int, expr.into())
41    }
42
43    pub fn to_str<T>(expr: T) -> Self
44    where
45        T: Into<Expr>,
46    {
47        Self::new(ValueType::Str, expr.into())
48    }
49}
50
51impl HirLowering for Conv {
52    fn lower<'hir, 'lir>(&'hir self, runtime: &mut HirLoweringRuntime<'lir>)
53    where
54        'hir: 'lir,
55    {
56        self.expr.lower(runtime);
57        runtime.emit(LirElement::conv(self.ty.clone()));
58    }
59}