Big Rewrite
This commit is contained in:
+18
-39
@@ -1,58 +1,37 @@
|
||||
mod declass;
|
||||
mod declosure;
|
||||
mod demutate;
|
||||
mod flatten;
|
||||
mod infer;
|
||||
mod libqjs;
|
||||
mod parse;
|
||||
mod regify;
|
||||
|
||||
use declass::declass;
|
||||
use declosure::declosure;
|
||||
use demutate::demutate;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
|
||||
use flatten::flatten;
|
||||
use infer::infer;
|
||||
use parse::QuickJSBinary;
|
||||
use infer::infer_types;
|
||||
use regify::regify;
|
||||
|
||||
fn main() {
|
||||
// Load source file
|
||||
let args = std::env::args().collect::<Vec<String>>();
|
||||
let filename = args.get(1).unwrap();
|
||||
|
||||
// Compile source file
|
||||
let source = std::fs::read_to_string(filename).unwrap();
|
||||
let bin = libqjs::compile(&source, filename).unwrap();
|
||||
let mut file = File::open(filename).unwrap();
|
||||
let metadata = std::fs::metadata(filename).unwrap();
|
||||
assert!(metadata.is_file());
|
||||
|
||||
// Parse, then flatten
|
||||
let (_, parsed) = QuickJSBinary::parse(&bin).unwrap();
|
||||
let (flat_fns, atoms) = flatten(parsed);
|
||||
let mut src = Vec::with_capacity(metadata.len() as usize);
|
||||
file.read_to_end(&mut src).unwrap();
|
||||
|
||||
println!("{flat_fns:#?}");
|
||||
// Compile to bytecode
|
||||
let binary = libqjs::compile(&src, filename);
|
||||
|
||||
println!("=== after regify ===");
|
||||
// Process it
|
||||
let (flat_fns, atoms) = flatten(binary);
|
||||
let reg_fns = regify(flat_fns);
|
||||
println!("{reg_fns:#?}");
|
||||
|
||||
println!("=== after declass ===");
|
||||
let declassed = declass(reg_fns);
|
||||
println!("{declassed:#?}");
|
||||
|
||||
println!("=== after declosure ===");
|
||||
let declosured = declosure(declassed);
|
||||
println!("{declosured:#?}");
|
||||
|
||||
println!("=== after demutate ===");
|
||||
let mut infer_fns = demutate(declosured);
|
||||
println!("{infer_fns:#?}");
|
||||
|
||||
println!("=== after infer ===");
|
||||
if let Some(main_id) = infer_fns.iter().position(|f| f.name == "main") {
|
||||
let ret = infer(main_id, &mut infer_fns);
|
||||
println!("main returns {ret:?}");
|
||||
println!("{infer_fns:#?}");
|
||||
} else {
|
||||
println!("no main");
|
||||
}
|
||||
|
||||
println!("{atoms:#?}");
|
||||
|
||||
let type_cache = infer_types(®_fns, &atoms);
|
||||
|
||||
println!("{type_cache:#?}");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user