use std::cell::{Cell, RefCell};
use crate::gc::GcRef;
use crate::proto::LuaProto;
use crate::upval::UpVal;
use crate::value::LuaValue;
pub type LuaCFnPtr = usize;
#[derive(Debug, Clone, Copy)]
pub enum LuaClosure {
Lua(GcRef<LuaLClosure>),
C(GcRef<LuaCClosure>),
LightC(LuaCFnPtr),
}
#[derive(Debug)]
pub struct LuaLClosure {
pub proto: GcRef<LuaProto>,
pub upvals: Vec<Cell<GcRef<UpVal>>>,
}
#[derive(Debug)]
pub struct LuaCClosure {
pub func: LuaCFnPtr,
pub upvalues: RefCell<Vec<LuaValue>>,
}
impl LuaLClosure {
pub fn placeholder() -> Self {
LuaLClosure {
proto: GcRef::new(LuaProto::placeholder()),
upvals: Vec::new(),
}
}
#[inline(always)]
pub fn upval(&self, i: usize) -> GcRef<UpVal> {
self.upvals[i].get()
}
pub fn set_upval(&self, i: usize, new: GcRef<UpVal>) {
self.upvals[i].set(new);
}
pub fn buffer_bytes(&self) -> usize {
self.upvals.capacity() * std::mem::size_of::<Cell<GcRef<UpVal>>>()
}
}
impl LuaCClosure {
pub fn buffer_bytes(&self) -> usize {
self.upvalues.borrow().capacity() * std::mem::size_of::<LuaValue>()
}
}