use std::borrow::Cow;
use crate::{
builder::Builder,
context::Shared,
error::Result,
types::TypeId,
value::{
FunctionBody, FunctionId, LocalBlockId, LocalInsnId, LocalParamId, LocalValueId,
block::{BasicBlock, EdgeId},
block_param::BlockParam,
function::FunctionInterface,
insn::Mnemonic,
},
};
pub struct DetachedMut<'a, 'str> {
pub body: &'a mut FunctionBody<'str>,
pub shared: &'a Shared<'str>,
pub interfaces: &'a jstd::registry::Registry<FunctionId, FunctionInterface<'str>>,
}
impl<'a, 'str> DetachedMut<'a, 'str> {
pub fn new(
body: &'a mut FunctionBody<'str>,
shared: &'a Shared<'str>,
interfaces: &'a jstd::registry::Registry<FunctionId, FunctionInterface<'str>>,
) -> Self {
Self {
body,
shared,
interfaces,
}
}
pub fn shr(&self) -> &Shared<'str> {
self.shared
}
pub fn make_block(&mut self) -> LocalBlockId {
self.body.make_block_local()
}
pub fn set_root(&mut self, root: LocalBlockId) {
self.body.set_root_id(Some(root));
}
pub fn block(&self, block: LocalBlockId) -> &BasicBlock<'str> {
self.body.block_local(block)
}
pub fn add_cfg_edge(&mut self, from: LocalBlockId, to: LocalBlockId) -> EdgeId {
self.body.add_cfg_edge_local(from, to)
}
pub fn push_mnemonic_with_type(&mut self, mnemonic: Mnemonic, type_id: TypeId) -> LocalInsnId {
self.body.push_mnemonic_with_type_local(mnemonic, type_id)
}
pub fn append_insn(&mut self, block: LocalBlockId, insn: LocalInsnId) {
self.body.append_insn_local(block, insn);
}
pub fn push_block_param(
&mut self,
block: LocalBlockId,
param: BlockParam<'str>,
) -> LocalParamId {
self.body.push_block_param_local(block, param)
}
pub fn replace_instruction_mnemonic(&mut self, insn: LocalInsnId, mnemonic: Mnemonic) {
self.body.replace_instruction_mnemonic_local(insn, mnemonic);
}
pub fn mnemonic(&self, insn: LocalInsnId) -> &Mnemonic {
self.body.mnemonic_local(insn)
}
pub fn type_of(&self, id: LocalValueId) -> TypeId {
self.body.local_type_of(self.shared, id)
}
pub fn rename_block(&mut self, block: LocalBlockId, name: Cow<'str, str>) -> Result<()> {
self.body.rename_block_local(block, name)
}
pub fn builder(&mut self, block: LocalBlockId) -> Builder<'str, '_> {
Builder::new_local(self.body, self.shared, self.interfaces, block)
}
}