yulang-runtime 0.1.0

Runtime IR, validation, monomorphization, and VM support for Yulang
Documentation
use super::*;

pub(super) fn value_hir_type(ty: &RuntimeType) -> &RuntimeType {
    match ty {
        RuntimeType::Thunk { value, .. } => value,
        other => other,
    }
}

pub(super) fn force_value_expr_profiled(
    expr: Expr,
    profile: &mut RuntimeAdapterProfile,
) -> (Expr, RuntimeType) {
    let value_ty = value_hir_type(&expr.ty).clone();
    if matches!(expr.ty, RuntimeType::Thunk { .. }) {
        profile.thunk_to_value += 1;
        profile.bind_here += 1;
    }
    let expr = bind_here_if_thunk(expr, value_ty.clone());
    (expr, value_ty)
}

pub(super) fn force_core_value_expr_profiled(
    expr: Expr,
    profile: &mut RuntimeAdapterProfile,
) -> (Expr, typed_ir::Type) {
    let (expr, ty) = force_value_expr_profiled(expr, profile);
    let ty = runtime_core_type(&ty);
    let expr = if matches!(expr.ty, RuntimeType::Core(_)) {
        expr
    } else {
        Expr::typed(expr.kind, RuntimeType::core(ty.clone()))
    };
    (expr, ty)
}