luallaby 0.1.0-alpha.3

**Work in progress** A pure-Rust Lua interpreter/compiler
Documentation
use crate::ast::Chunk;
use crate::compiler::{Compiler, ScopeType};
use crate::error::Result;
use crate::vm::{FuncObject, OpCode, Value};

impl<'a> Compiler<'a> {
    pub(super) fn compile_chunk(&mut self, chunk: Chunk) -> Result<FuncObject> {
        let (label, _) = self.code.new_chunk();
        self.scope_enter(ScopeType::Func);

        if !self.compile_block(chunk.block)? {
            let ret_reg = self.scopes.reg_reserve();
            self.code.emit(OpCode::Lit {
                val: Value::empty(),
                dst_reg: ret_reg,
            });
            self.code.emit(OpCode::Return { ret_reg }); // Ensure that function has at least one return
            self.scopes.reg_free(ret_reg);
        }

        let scope = self.scope_leave(ScopeType::Func)?.unwrap();
        assert!(scope.locals.is_empty());
        assert!(scope.ups.is_empty());
        Ok(FuncObject {
            regs: scope.regs.count(),
            locals_cap: scope.locals_cap,
            params: Vec::new(),
            ups: Vec::new(),
            varargs: true,
            chunk: label,
        })
    }
}