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 }); 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,
})
}
}