extern crate goscript_codegen as cg;
extern crate goscript_parser as fe;
extern crate goscript_types as types;
extern crate goscript_vm as vm;
use super::std::fmt;
pub struct Config {
pub work_dir: Option<String>,
pub base_path: Option<String>,
pub trace_parser: bool,
pub trace_checker: bool,
pub trace_vm: bool,
}
pub struct Engine {
config: Config,
ffi: vm::ffi::FfiFactory,
}
impl Engine {
pub fn new(config: Config) -> Engine {
let mut ffi = vm::ffi::FfiFactory::new();
ffi.register("fmt", Box::new(fmt::Fmt::new));
Engine {
config: config,
ffi: ffi,
}
}
pub fn run(&self, path: &str) -> usize {
let config = types::Config {
work_dir: self.config.work_dir.clone(),
base_path: self.config.base_path.clone(),
trace_parser: self.config.trace_parser,
trace_checker: self.config.trace_checker,
};
let mut fs = fe::FileSet::new();
let el = &mut fe::errors::ErrorList::new();
let code = cg::entry::parse_check_gen(path, &config, &mut fs, el);
if let Ok(bc) = code {
let vm = vm::vm::GosVM::new(bc, &self.ffi, Some(&fs));
vm.run();
0
} else {
if self.config.trace_vm {
el.sort();
print!("{}", el);
}
code.unwrap_err()
}
}
pub fn register_extension(&mut self, name: &'static str, ctor: Box<vm::ffi::Ctor>) {
self.ffi.register(name, ctor);
}
}