some tidying up

This commit is contained in:
2021-10-26 21:02:57 +02:00
parent af1c8f999b
commit 7f5dd9aa80
5 changed files with 63 additions and 17 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/target
*.uw8

7
Cargo.lock generated
View File

@@ -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",

View File

@@ -9,3 +9,4 @@ edition = "2021"
nom = "7"
wasmparser = "0.81"
wasm-encoder = "0.8"
anyhow = "1"

View File

@@ -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)?;
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)
);
}
};
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))
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<usize> {
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");
}