llua 0.1.3

Low level bindings to Lua5.4
Documentation
use crate::*;

impl State {
    pub fn to_ffi_pointer(&self, i: Index) -> Option<usize> {
        Some(match self.type_of(i) {
            Type::Number => {
                if self.is_integer(i) {
                    self.to_integer(i) as usize
                } else {
                    self.to_number(i) as usize
                }
            }
            Type::String => self.to_string(i) as usize,
            _ => {
                let ptr = self.to_pointer(i);
                if ptr.is_null() {
                    return None;
                }
                ptr as usize
            }
        })
    }

    pub fn init_llua_global(&self) {
        let s = self.balance();
        let g = s.global();

        g.setf(cstr!("__llua_psize"), core::mem::size_of::<usize>());
        g.setf(
            cstr!("topointer"),
            RsFn::new(|s: &State| Self::to_ffi_pointer(s, 1)),
        );
        g.setf(
            cstr!("cclosure"),
            RsFn::new(|s: &State| {
                if let Some(f) = s.to_cfunction(1) {
                    s.push_cclosure(Some(f), s.get_top() - 1);
                    Pushed(1)
                } else {
                    s.type_error(1, cstr!("cfunction"));
                }
            }),
        );
        binding::init_global(&s);
    }
}