dynamo/
lib.rs

1#![cfg_attr(test, feature(test))]
2extern crate piston_meta;
3
4pub mod ast;
5pub mod runtime;
6pub mod lifetime;
7
8/// Runs a program using a syntax file and the source file.
9pub fn run(syntax: &str, source: &str) {
10    use std::thread;
11    use piston_meta::{json, load_syntax_data};
12
13    let data = load_syntax_data(syntax, source);
14    let check_data = data.clone();
15
16    // Do lifetime checking in parallel directly on meta data.
17    let handle = thread::spawn(move || {
18        let check_data = check_data;
19        lifetime::check(&check_data)
20    });
21
22    // Convert to AST.
23    let mut ignored = vec![];
24    let ast = ast::convert(&data, &mut ignored).unwrap();
25
26    // Check that lifetime checking succeeded.
27    match handle.join().unwrap() {
28        Ok(()) => {}
29        Err(msg) => panic!(msg)
30    }
31
32    let mut runtime = runtime::Runtime::new();
33    if ignored.len() > 0 {
34        println!("START IGNORED");
35        if ignored.len() > 0 {
36            for r in &ignored {
37                json::print(&data[r.iter()]);
38            }
39        }
40        println!("END IGNORED");
41        panic!("Some meta data was ignored in the syntax");
42    }
43    runtime.run(&ast);
44}
45
46#[cfg(test)]
47mod tests {
48    extern crate test;
49
50    use super::run;
51    use self::test::Bencher;
52
53    #[bench]
54    fn bench_add_two(b: &mut Bencher) {
55        b.iter(||
56            run("assets/syntax.txt", "source/bench/add.rs")
57        );
58    }
59
60}