use std::fs::File; use std::io; use std::io::prelude::*; use std::path::Path; use boa_interner::Interner; use boa_parser::Parser; use boa_parser::Source; use ion::IonValue; use runtime::Runtime; mod ion; mod runtime; #[derive(Debug)] pub enum RelJsError { IoError(io::Error), JsParseError(boa_parser::Error), BytecodeEOF, } impl From for RelJsError { fn from(value: io::Error) -> Self { RelJsError::IoError(value) } } impl From for RelJsError { fn from(value: boa_parser::Error) -> Self { RelJsError::JsParseError(value) } } fn main() -> Result<(), RelJsError> { //let src = Source::from_filepath(Path::new("script.js"))?; //let mut parser = Parser::new(src); //let mut interner = Interner::new(); //let script = parser.parse_script(&mut interner)?; let mut bin = File::open("demo/test-1.bin")?; let mut data = Vec::new(); bin.read_to_end(&mut data)?; let mut runtime = Runtime::new(); let fnref = runtime.load_bytecode(data); let mut args = Vec::with_capacity(3); args.push(IonValue::new_null()); args.push(IonValue::new_null()); args.push(IonValue::new_null()); let result = runtime.invoke(fnref, args); for (i, v) in result.iter().enumerate() { println!("Result {i}:"); for b in v.bytes() { print!("{b:02x} "); } println!("\n"); } Ok(()) }