brainterpreter 0.1.1

An interpreter for a Bauble toy programming language
Documentation
use std::num::IntErrorKind;

use crate::vm::opcode::{Chunk, Op};

#[derive(Debug)]
pub struct CallFrame {
    ip: usize,
    chunk: Chunk,
    stack_top: usize,
}

impl CallFrame {
    pub fn new(chunk: Chunk, stack_top: usize) -> Self {
        CallFrame {
            chunk,
            ip: 0,
            stack_top,
        }
    }

    pub fn advance(&mut self) -> Option<&Op> {
        let op = self.chunk.op(self.ip);
        self.ip += 1;
        op
    }

    pub fn stack_top(&self) -> usize {
        self.stack_top
    }

    pub fn ip(&self) -> usize {
        self.ip
    }

    pub fn jump_to(&mut self, ip: usize) {
        self.ip = ip;
    }

    pub fn jump(&mut self, offset: isize) -> Result<(), IntErrorKind> {
        let ip = self
            .ip
            .checked_add_signed(offset)
            .ok_or(IntErrorKind::NegOverflow)?;
        self.jump_to(ip);
        Ok(())
    }

    pub fn chunk(&self) -> &Chunk {
        &self.chunk
    }
}