use std::io; use std::path::Path; use boa_interner::Interner; use boa_parser::Parser; use boa_parser::Source; use crate::js::JsCompiler; use crate::runtime::Runtime; mod js; 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) } } #[tokio::main] async fn main() -> Result<(), RelJsError> { let src = Source::from_filepath(Path::new("demo/script.js"))?; let mut parser = Parser::new(src); let mut interner = Interner::new(); let script = parser.parse_script(&mut interner)?; let mut compiler = JsCompiler::new(interner); compiler.compile_script(script); compiler.dump(); let mut runtime = Runtime::from(compiler); let function_id = runtime.to_symbol_id("main") .expect("script.js is missing a main function"); let mut result = runtime.invoke(function_id, vec![]); while let Some(value) = result.recv().await { println!("Result:"); for b in value.bytes() { print!("{b:02x} "); } println!("\n"); } Ok(()) }