use crate::{ControlStackFrame, ControlStackFrameType, Function, Result};
impl Function {
pub(crate) fn handle_return(&mut self) -> Result<()> {
let results = self.ty.results();
tracing::trace!("handle return, results: {results:?}");
self.masm.main_return(results)
}
pub(crate) fn handle_call_return(&mut self) -> Result<()> {
let results = self.ty.results();
tracing::trace!("handle call return: {:?}", results);
self.masm.call_return(results)
}
pub(crate) fn handle_frame_popping(&mut self, frame: ControlStackFrame) -> Result<()> {
match frame.ty {
ControlStackFrameType::If(true) => {
self.handle_return()
}
ControlStackFrameType::Block => self.masm._jumpdest(),
ControlStackFrameType::Loop => Ok(()),
_ => self.handle_jumpdest(frame.original_pc_offset),
}
}
pub(crate) fn handle_jumpdest(&mut self, original_pc: u16) -> Result<()> {
self.table.label(original_pc, self.masm.pc_offset());
self.masm._jumpdest()?;
Ok(())
}
}