summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/cli/Cargo.toml5
-rw-r--r--crates/cli/bin.rs21
-rw-r--r--crates/cli/wat.rs10
-rw-r--r--crates/parser/src/lib.rs4
-rw-r--r--crates/parser/src/module.rs4
-rw-r--r--crates/tinywasm/src/module.rs2
6 files changed, 38 insertions, 8 deletions
diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml
index 783ead2..505b025 100644
--- a/crates/cli/Cargo.toml
+++ b/crates/cli/Cargo.toml
@@ -15,3 +15,8 @@ argh="0.1"
color-eyre="0.6"
log="0.4"
pretty_env_logger="0.5"
+wast={version="69.0", optional=true}
+
+[features]
+default=["wast"]
+wast=["dep:wast"]
diff --git a/crates/cli/bin.rs b/crates/cli/bin.rs
index 181b2e1..a067ca8 100644
--- a/crates/cli/bin.rs
+++ b/crates/cli/bin.rs
@@ -3,8 +3,9 @@ use std::str::FromStr;
use argh::FromArgs;
use color_eyre::eyre::Result;
use log::info;
-use tinywasm::{self, WasmValue};
+use tinywasm::{self, Module, WasmValue};
mod util;
+mod wat;
#[derive(FromArgs)]
/// TinyWasm CLI
@@ -68,20 +69,30 @@ fn main() -> Result<()> {
.filter_level(level)
.init();
+ let cwd = std::env::current_dir()?;
+
match args.nested {
TinyWasmSubcommand::Run(Run { wasm_file, engine }) => {
- let wasm = std::fs::read(wasm_file)?;
+ let path = cwd.join(wasm_file.clone());
+ let module = match wasm_file.ends_with(".wat") {
+ true => {
+ let wat = std::fs::read_to_string(path)?;
+ let wasm = wat::wat2wasm(&wat);
+ tinywasm::Module::parse_bytes(&wasm)?
+ }
+ false => tinywasm::Module::parse_file(path)?,
+ };
+
match engine {
- Engine::Main => run(&wasm),
+ Engine::Main => run(module),
}
}
}
}
-fn run(wasm: &[u8]) -> Result<()> {
+fn run(module: Module) -> Result<()> {
let mut store = tinywasm::Store::default();
- let module = tinywasm::Module::parse_bytes(wasm)?;
let instance = module.instantiate(&mut store)?;
let func = instance.get_func(&store, "add")?;
let params = vec![WasmValue::I32(2), WasmValue::I32(2)];
diff --git a/crates/cli/wat.rs b/crates/cli/wat.rs
new file mode 100644
index 0000000..22d931d
--- /dev/null
+++ b/crates/cli/wat.rs
@@ -0,0 +1,10 @@
+use wast::{
+ parser::{self, ParseBuffer},
+ Wat,
+};
+
+pub fn wat2wasm<'a>(wat: &str) -> Vec<u8> {
+ let buf = ParseBuffer::new(wat).expect("failed to create parse buffer");
+ let mut module = parser::parse::<Wat>(&buf).expect("failed to parse wat");
+ module.encode().expect("failed to encode wat")
+}
diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs
index 3cc51d6..b1729f4 100644
--- a/crates/parser/src/lib.rs
+++ b/crates/parser/src/lib.rs
@@ -40,10 +40,10 @@ impl Parser {
#[cfg(feature = "std")]
pub fn parse_module_file(
&self,
- path: impl AsRef<crate::std::path::Path>,
+ path: impl AsRef<crate::std::path::Path> + Clone,
) -> Result<TinyWasmModule> {
use alloc::format;
- let f = crate::std::fs::File::open("log.txt").map_err(|e| {
+ let f = crate::std::fs::File::open(path.clone()).map_err(|e| {
ParseError::Other(format!("Error opening file {:?}: {}", path.as_ref(), e))
})?;
diff --git a/crates/parser/src/module.rs b/crates/parser/src/module.rs
index 268bad7..2beba9e 100644
--- a/crates/parser/src/module.rs
+++ b/crates/parser/src/module.rs
@@ -162,6 +162,10 @@ impl ModuleReader {
validator.end(offset)?;
self.end_reached = true;
}
+ CustomSection(reader) => {
+ debug!("Found custom section");
+ debug!("Skipping custom section: {:?}", reader.name());
+ }
UnknownSection { .. } => {
return Err(ParseError::UnsupportedSection("Unknown section".into()))
}
diff --git a/crates/tinywasm/src/module.rs b/crates/tinywasm/src/module.rs
index 05bd643..8e258fd 100644
--- a/crates/tinywasm/src/module.rs
+++ b/crates/tinywasm/src/module.rs
@@ -21,7 +21,7 @@ impl Module {
}
#[cfg(feature = "std")]
- pub fn parse_file(path: impl AsRef<crate::std::path::Path>) -> Result<Self> {
+ pub fn parse_file(path: impl AsRef<crate::std::path::Path> + Clone) -> Result<Self> {
let parser = tinywasm_parser::Parser::new();
let data = parser.parse_module_file(path)?;
Ok(data.into())