goscript_engine/
engine.rs1extern 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 pub work_dir: Option<String>,
10 pub base_path: Option<String>,
12 pub trace_parser: bool,
14 pub trace_checker: bool,
16 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}