#![allow(dead_code)] mod common; mod vm; use std::{convert::TryFrom, env, fs, io, process}; type Result = std::result::Result>; fn get_input_string() -> io::Result { let args: Vec = env::args().collect(); if args.len() <= 1 { println!( "usage: {} file.asm", args.get(0).map(String::as_str).unwrap_or("rasp") ); process::exit(1); } else { fs::read_to_string(&args[1]) } } fn main() -> Result<()> { use vm::obj::syn::parser::SectionsParser; let contents = get_input_string()?; let ast = match SectionsParser::new().parse(&contents) { Ok(ast) => ast, Err(err) => { eprintln!("{}", err); process::exit(1); } }; let obj = vm::obj::obj::Object::try_from(&ast)?; //dump(&obj)?; let mut vm = vm::vm::Vm::new(); vm.load_object(obj, 1024 * 1024 * 64)?; // 64mb let status = vm.run()?; println!("{}", status); Ok(()) } fn dump(obj: &vm::obj::obj::Object) -> Result<()> { use vm::obj::obj::Section; use vm::visit::VisitInst; let mut stdout = io::stdout(); for section in &obj.sections { let mut disasm = match section { Section::Code { start, contents, .. } => { vm::disassemble::Disassemble::new(&mut stdout, contents, *start) } Section::Meta { .. } | Section::Data { .. } => continue, }; while !disasm.is_done() { disasm.visit_inst()?; } println!(); } Ok(()) }