pd-vm 0.22.4

RustScript bytecode compiler and VM
Documentation
#![allow(dead_code)]
use super::ir::{SsaExit, SsaMaterialization, SsaValue, SsaValueId, SsaValueRepr};

pub(crate) fn materialize_ssa_values(
    values: impl IntoIterator<Item = SsaValue>,
) -> Vec<SsaMaterialization> {
    values.into_iter().map(materialize_ssa_value).collect()
}

pub(crate) fn materialize_ssa_value(value: SsaValue) -> SsaMaterialization {
    match value.repr {
        SsaValueRepr::Tagged => SsaMaterialization::Value(value.id),
        SsaValueRepr::I64 => SsaMaterialization::BoxInt(value.id),
        SsaValueRepr::F64 => SsaMaterialization::BoxFloat(value.id),
        SsaValueRepr::Bool => SsaMaterialization::BoxBool(value.id),
        SsaValueRepr::HeapPtr(tag) => SsaMaterialization::BoxHeapPtr {
            value: value.id,
            tag,
        },
    }
}

pub(crate) fn exit_inputs(exit: &SsaExit) -> Vec<SsaValueId> {
    let mut out = Vec::new();
    for materialization in exit.stack.iter().chain(exit.locals.iter()) {
        let value = match materialization {
            SsaMaterialization::Value(value)
            | SsaMaterialization::BoxInt(value)
            | SsaMaterialization::BoxFloat(value)
            | SsaMaterialization::BoxBool(value) => *value,
            SsaMaterialization::BoxHeapPtr { value, .. } => *value,
        };
        if !out.contains(&value) {
            out.push(value);
        }
    }
    out
}