neige-lua 0.1.3

一个简单的lua运行时
Documentation
use crate::{
    api::{AccessApi, LuaVm, PushApi, StackApi},
    state::LuaState,
};

impl LuaState {
    pub(super) fn pop_result(&mut self, a: isize, c: isize) {
        if c > 1 {
            let mut i = a + c - 2;
            while i >= a {
                self.replace(i);
                i -= 1;
            }
        } else if c < 1 {
            self.check_stack(1);
            self.push_integer(a as i64)
        }
    }

    pub(super) fn push_func_and_args(&mut self, a: isize, b: isize) -> isize {
        if b >= 1 {
            self.check_stack(b as usize);
            for i in a..a + b {
                self.push_value(i)
            }
            b - 1
        } else {
            self.fix_stack(a);
            self.get_top() - self.register_count() as isize - 1
        }
    }

    pub(super) fn fix_stack(&mut self, a: isize) {
        let x = self.to_integer(-1) as isize;
        self.pop(1);
        if x > a {
            self.check_stack((x - a) as usize);
        }
        for i in a..x {
            self.push_value(i)
        }
        self.rotate(self.register_count() as isize + 1, x - a)
    }
}