use alloc::vec::Vec;
use alloc::string::String;
use bytecode_lang::{FuncId, GlobalId, Module, TypeId};
use hir_lang::{ItemId, NodeRef};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Compiled {
pub(crate) module: Module,
pub(crate) entry: FuncId,
pub(crate) start: Option<FuncId>,
pub(crate) result: Option<GlobalId>,
pub(crate) functions: Vec<(ItemId, FuncId)>,
pub(crate) origins: Vec<Vec<NodeRef>>,
pub(crate) classes: Vec<(ItemId, TypeId)>,
pub(crate) methods: Vec<((ItemId, ItemId), FuncId)>,
pub(crate) destructor: Option<String>,
}
impl Compiled {
#[must_use]
pub fn module(&self) -> &Module {
&self.module
}
#[must_use]
pub fn into_module(self) -> Module {
self.module
}
#[must_use]
pub fn entry(&self) -> FuncId {
self.entry
}
#[must_use]
pub fn start(&self) -> Option<FuncId> {
self.start
}
#[must_use]
pub fn result_global(&self) -> Option<GlobalId> {
self.result
}
#[must_use]
pub fn function(&self, item: ItemId) -> Option<FuncId> {
self.functions
.iter()
.find(|(i, _)| *i == item)
.map(|&(_, f)| f)
}
#[must_use]
pub fn origin(&self, func: FuncId, pc: u32) -> Option<NodeRef> {
self.origins
.get(func.index())
.and_then(|o| o.get(pc as usize))
.copied()
}
#[must_use]
pub fn origins(&self, func: FuncId) -> &[NodeRef] {
self.origins.get(func.index()).map_or(&[], Vec::as_slice)
}
#[must_use]
pub fn class_type(&self, class: hir_lang::ItemId) -> Option<TypeId> {
self.classes
.iter()
.find(|(i, _)| *i == class)
.map(|&(_, t)| t)
}
#[must_use]
pub fn method(&self, class: hir_lang::ItemId, method: hir_lang::ItemId) -> Option<FuncId> {
self.methods
.iter()
.find(|(k, _)| *k == (class, method))
.map(|&(_, f)| f)
}
#[must_use]
pub fn destructor(&self) -> Option<&str> {
self.destructor.as_deref()
}
}