goscript_engine/
engine.rs

1extern crate goscript_codegen as cg;
2extern crate goscript_parser as fe;
3extern crate goscript_types as types;
4extern crate goscript_vm as vm;
5use super::std::fmt;
6
7pub struct Config {
8    // working directory
9    pub work_dir: Option<String>,
10    // base path for non-local imports
11    pub base_path: Option<String>,
12    // print debug info in parser
13    pub trace_parser: bool,
14    // print debug info in checker
15    pub trace_checker: bool,
16    // proint debug info for vm
17    pub trace_vm: bool,
18}
19
20pub struct Engine {
21    config: Config,
22    ffi: vm::ffi::FfiFactory,
23}
24
25impl Engine {
26    pub fn new(config: Config) -> Engine {
27        let mut ffi = vm::ffi::FfiFactory::new();
28        ffi.register("fmt", Box::new(fmt::Fmt::new));
29        Engine {
30            config: config,
31            ffi: ffi,
32        }
33    }
34
35    pub fn run(&self, path: &str) -> usize {
36        let config = types::Config {
37            work_dir: self.config.work_dir.clone(),
38            base_path: self.config.base_path.clone(),
39            trace_parser: self.config.trace_parser,
40            trace_checker: self.config.trace_checker,
41        };
42        let mut fs = fe::FileSet::new();
43        let el = &mut fe::errors::ErrorList::new();
44        let code = cg::entry::parse_check_gen(path, &config, &mut fs, el);
45        if let Ok(bc) = code {
46            let vm = vm::vm::GosVM::new(bc, &self.ffi, Some(&fs));
47            vm.run();
48            0
49        } else {
50            if self.config.trace_vm {
51                el.sort();
52                print!("{}", el);
53            }
54            code.unwrap_err()
55        }
56    }
57
58    pub fn register_extension(&mut self, name: &'static str, ctor: Box<vm::ffi::Ctor>) {
59        self.ffi.register(name, ctor);
60    }
61}