neige-lua 0.1.3

一个简单的lua运行时
Documentation
use std::{
    cell::{Ref, RefCell, RefMut},
    rc::Rc,
};

use neige_infra::{LUA_MINSTACK, LUA_RIDX_GLOBALS};

use crate::value::{closure::Closure, table::LuaTable, value::LuaValue};

use super::stack::LuaStack;

#[derive(Debug, Clone)]
pub struct LuaNode {
    pub registry: Rc<LuaTable>,
    pub stack: Option<Rc<RefCell<LuaStack>>>,
}

impl LuaNode {
    pub(super) fn new() -> Rc<RefCell<Self>> {
        let table = LuaTable::new(0, 0);
        table.put(
            LuaValue::Integer(LUA_RIDX_GLOBALS),
            LuaValue::new_table(0, 0),
        );
        let node = Rc::new(RefCell::new(Self {
            stack: None,
            registry: Rc::new(table),
        }));
        let stack = LuaStack::new(LUA_MINSTACK, &node, Rc::new(Closure::new_fake_closure()));
        node.borrow_mut().stack = Some(stack);
        node
    }

    pub(crate) fn get_stack(&self) -> Ref<LuaStack> {
        if let Some(stack) = &self.stack {
            stack.borrow()
        } else {
            panic!("state has not stack")
        }
    }

    pub(crate) fn get_stack_mut(&self) -> RefMut<LuaStack> {
        if let Some(stack) = &self.stack {
            stack.borrow_mut()
        } else {
            panic!("state has not stack")
        }
    }
}