mirror of
https://github.com/exoticorn/curlywas.git
synced 2026-01-20 11:46:43 +01:00
some tidying up
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/target
|
/target
|
||||||
|
*.uw8
|
||||||
|
|||||||
7
Cargo.lock
generated
7
Cargo.lock
generated
@@ -2,10 +2,17 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.44"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hwas"
|
name = "hwas"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
"nom",
|
"nom",
|
||||||
"wasm-encoder",
|
"wasm-encoder",
|
||||||
"wasmparser",
|
"wasmparser",
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ edition = "2021"
|
|||||||
nom = "7"
|
nom = "7"
|
||||||
wasmparser = "0.81"
|
wasmparser = "0.81"
|
||||||
wasm-encoder = "0.8"
|
wasm-encoder = "0.8"
|
||||||
|
anyhow = "1"
|
||||||
69
src/main.rs
69
src/main.rs
@@ -1,24 +1,61 @@
|
|||||||
use std::fs::File;
|
use anyhow::{anyhow, bail, Result};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
|
use std::{fs::File, path::PathBuf};
|
||||||
|
|
||||||
mod parser;
|
|
||||||
mod ast;
|
mod ast;
|
||||||
mod typecheck;
|
|
||||||
mod constfold;
|
mod constfold;
|
||||||
mod emit;
|
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 mut script = match parser::parse(input.as_str()) {
|
||||||
let input = include_str!("../test.hw");
|
Ok(script) => script,
|
||||||
let result = parser::parse(input);
|
Err(err) => {
|
||||||
match result {
|
bail!(
|
||||||
Ok(mut script) => {
|
"parse error: {}",
|
||||||
constfold::fold_script(&mut script);
|
nom::error::convert_error(input.as_str(), err)
|
||||||
typecheck::tc_script(&mut script).unwrap();
|
);
|
||||||
let wasm = emit::emit(&script);
|
}
|
||||||
let mut file = File::create("test.wasm").unwrap();
|
};
|
||||||
file.write_all(&wasm).unwrap();
|
|
||||||
},
|
constfold::fold_script(&mut script);
|
||||||
Err(err) => println!("error: {}", nom::error::convert_error(input, err))
|
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<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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user