From 7f5dd9aa80c4927694f92e6fea0ab1fdec5392d3 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Tue, 26 Oct 2021 21:02:57 +0200 Subject: [PATCH] some tidying up --- .gitignore | 1 + Cargo.lock | 7 +++++ Cargo.toml | 3 +- src/main.rs | 69 +++++++++++++++++++++++++++++++---------- test.hw => xorscroll.hw | 0 5 files changed, 63 insertions(+), 17 deletions(-) rename test.hw => xorscroll.hw (100%) diff --git a/.gitignore b/.gitignore index ea8c4bf..d47b816 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +*.uw8 diff --git a/Cargo.lock b/Cargo.lock index dca4237..8886c5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,10 +2,17 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anyhow" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" + [[package]] name = "hwas" version = "0.1.0" dependencies = [ + "anyhow", "nom", "wasm-encoder", "wasmparser", diff --git a/Cargo.toml b/Cargo.toml index e7ffaac..a922053 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,5 @@ edition = "2021" [dependencies] nom = "7" wasmparser = "0.81" -wasm-encoder = "0.8" \ No newline at end of file +wasm-encoder = "0.8" +anyhow = "1" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4250b06..9f5bf75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,61 @@ -use std::fs::File; +use anyhow::{anyhow, bail, Result}; use std::io::prelude::*; +use std::{fs::File, path::PathBuf}; -mod parser; mod ast; -mod typecheck; mod constfold; mod emit; +mod parser; +mod typecheck; +fn main() -> Result<()> { + let mut filename = PathBuf::from( + std::env::args() + .nth(1) + .ok_or_else(|| anyhow!("Path to .hw file missing"))?, + ); + let mut input = String::new(); + File::open(&filename)?.read_to_string(&mut input)?; -fn main() { - let input = include_str!("../test.hw"); - let result = parser::parse(input); - match result { - Ok(mut script) => { - constfold::fold_script(&mut script); - typecheck::tc_script(&mut script).unwrap(); - let wasm = emit::emit(&script); - let mut file = File::create("test.wasm").unwrap(); - file.write_all(&wasm).unwrap(); - }, - Err(err) => println!("error: {}", nom::error::convert_error(input, err)) - } + let mut script = match parser::parse(input.as_str()) { + Ok(script) => script, + Err(err) => { + bail!( + "parse error: {}", + nom::error::convert_error(input.as_str(), err) + ); + } + }; + + constfold::fold_script(&mut script); + typecheck::tc_script(&mut script).unwrap(); + let wasm = emit::emit(&script); + + wasmparser::validate(&wasm)?; + + filename.set_extension("uw8"); + File::create(filename)?.write_all(&wasm)?; + + println!("Size of code section: {} bytes", code_section_size(&wasm)?); + + Ok(()) +} + +fn code_section_size(wasm: &[u8]) -> Result { + for payload in wasmparser::Parser::new(0).parse_all(wasm) { + match payload? { + wasmparser::Payload::CodeSectionStart { range, .. } => { + let size = range.end - range.start; + let section_header_size = match size { + 0..=127 => 2, + 128..=16383 => 3, + _ => 4, + }; + return Ok(size + section_header_size); + } + _ => (), + } + } + + bail!("No code section found"); } diff --git a/test.hw b/xorscroll.hw similarity index 100% rename from test.hw rename to xorscroll.hw