use crate::grain::bytecode::code::disassemble;
use crate::grain::bytecode::Op;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Chunk {
entry: u32,
end: u32,
max_stack: u16,
}
impl Chunk {
pub(crate) fn new(entry: u32, end: u32, max_stack: u16) -> Self {
Self {
entry,
end,
max_stack,
}
}
#[must_use]
pub fn entry(&self) -> u32 {
self.entry
}
#[must_use]
pub fn end(&self) -> u32 {
self.end
}
#[must_use]
pub fn max_stack(&self) -> u16 {
self.max_stack
}
pub(crate) fn set_max_stack(&mut self, max_stack: u16) {
self.max_stack = max_stack;
}
#[must_use]
pub fn body<'c>(&self, code: &'c [u8]) -> &'c [u8] {
code.get(self.entry as usize..self.end as usize)
.unwrap_or_default()
}
pub fn ops<'c>(&self, code: &'c [u8]) -> impl Iterator<Item = (usize, Op)> + 'c {
let entry = self.entry as usize;
disassemble(self.body(code)).map(move |(at, op)| (at + entry, op))
}
}