summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/cli/bin.rs4
-rw-r--r--crates/tinywasm/src/engine/mod.rs20
-rw-r--r--crates/tinywasm/src/lib.rs2
-rw-r--r--crates/tinywasm/src/module/mod.rs50
-rw-r--r--crates/tinywasm/src/module/reader.rs20
-rw-r--r--crates/tinywasm/src/runtime/executer.rs (renamed from crates/tinywasm/src/engine/executer.rs)0
-rw-r--r--crates/tinywasm/src/runtime/mod.rs14
-rw-r--r--crates/tinywasm/src/runtime/stack/call.rs (renamed from crates/tinywasm/src/engine/stack/call.rs)0
-rw-r--r--crates/tinywasm/src/runtime/stack/mod.rs (renamed from crates/tinywasm/src/engine/stack/mod.rs)0
-rw-r--r--crates/tinywasm/src/runtime/types.rs (renamed from crates/tinywasm/src/engine/types.rs)2
-rw-r--r--crates/tinywasm/src/store.rs37
11 files changed, 62 insertions, 87 deletions
diff --git a/crates/cli/bin.rs b/crates/cli/bin.rs
index 18b61cc..7cc0703 100644
--- a/crates/cli/bin.rs
+++ b/crates/cli/bin.rs
@@ -68,9 +68,9 @@ fn main() -> Result<()> {
}
fn run(wasm: &[u8]) -> Result<()> {
+ let module = tinywasm::Module::try_new(wasm)?;
let mut store = tinywasm::Store::default();
- let mut module = tinywasm::Module::try_new(&mut store, wasm)?;
- let instance = tinywasm::ModuleInstance::new(&mut module)?;
+ let _instance = tinywasm::ModuleInstance::new(&mut store, &module)?;
Ok(())
}
diff --git a/crates/tinywasm/src/engine/mod.rs b/crates/tinywasm/src/engine/mod.rs
deleted file mode 100644
index a134659..0000000
--- a/crates/tinywasm/src/engine/mod.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-mod executer;
-mod stack;
-mod types;
-
-pub use executer::*;
-pub use stack::*;
-pub use types::*;
-
-#[derive(Debug)]
-pub struct Engine {
- pub stack: Stack,
-}
-
-impl Default for Engine {
- fn default() -> Self {
- Self {
- stack: Stack::default(),
- }
- }
-}
diff --git a/crates/tinywasm/src/lib.rs b/crates/tinywasm/src/lib.rs
index f4bdd65..c362526 100644
--- a/crates/tinywasm/src/lib.rs
+++ b/crates/tinywasm/src/lib.rs
@@ -18,8 +18,8 @@ pub use module::ModuleInstance;
pub mod types;
pub use types::*;
-pub mod engine;
pub mod naive;
+pub mod runtime;
#[cfg(test)]
mod tests {
diff --git a/crates/tinywasm/src/module/mod.rs b/crates/tinywasm/src/module/mod.rs
index 51731e9..a3a8e44 100644
--- a/crates/tinywasm/src/module/mod.rs
+++ b/crates/tinywasm/src/module/mod.rs
@@ -1,7 +1,7 @@
use alloc::vec::Vec;
use wasmparser::{Export, FuncType, Validator};
-use crate::{engine::FuncAddr, Error, Result, Store};
+use crate::{runtime::FuncAddr, Error, Result, Store};
use self::reader::ModuleReader;
@@ -9,34 +9,38 @@ pub mod reader;
#[derive(Debug)]
pub struct Module<'a> {
- store: &'a mut Store<'a>,
reader: ModuleReader<'a>,
}
/// A WebAssembly Module Instance.
+/// Addrs are indices into the store's data structures.
/// See https://webassembly.github.io/spec/core/exec/runtime.html#module-instances
#[derive(Debug)]
pub struct ModuleInstance<'m, 'data> {
- pub module: &'m Module<'data>,
+ pub(crate) module: &'m Module<'data>,
- pub types: Vec<FuncType>,
- pub func_addrs: Vec<FuncAddr>,
+ pub(crate) types: Vec<FuncType>,
+ pub(crate) func_addrs: Vec<FuncAddr>,
// pub table_addrs: Vec<TableAddr>,
// pub mem_addrs: Vec<MemAddr>,
// pub global_addrs: Vec<GlobalAddr>,
// pub elem_addrs: Vec<ElmAddr>,
// pub data_addrs: Vec<DataAddr>,
- pub exports: Vec<Export<'data>>,
+ pub(crate) exports: Vec<Export<'data>>,
}
-impl<'m, 'data> ModuleInstance<'m, 'data> {
- pub fn new(module: &'m mut Module<'data>) -> Result<Self> {
+impl<'m, 'data> ModuleInstance<'m, 'data>
+where
+ 'm: 'data,
+{
+ pub fn new(store: &'data mut Store<'data>, module: &'m Module<'data>) -> Result<Self> {
let types = module
.reader
.type_section
- .take()
+ .as_ref()
.map(|s| {
- s.into_iter()
+ s.clone()
+ .into_iter()
.map(|ty| {
let wasmparser::Type::Func(func) = ty?;
Ok(func)
@@ -49,22 +53,32 @@ impl<'m, 'data> ModuleInstance<'m, 'data> {
let func_addrs = module
.reader
.function_section
- .take()
- .map(|s| s.into_iter().map(|f| Ok(f?)).collect::<Result<Vec<_>>>())
+ .as_ref()
+ .map(|s| {
+ s.clone()
+ .into_iter()
+ .map(|f| Ok(f?))
+ .collect::<Result<Vec<_>>>()
+ })
.transpose()?
.unwrap_or_default();
let exports = module
.reader
.export_section
- .take()
- .map(|s| s.into_iter().map(|e| Ok(e?)).collect::<Result<Vec<_>>>())
+ .as_ref()
+ .map(|s| {
+ s.clone()
+ .into_iter()
+ .map(|e| Ok(e?))
+ .collect::<Result<Vec<_>>>()
+ })
.transpose()?
.unwrap_or_default();
+ store.initialize(&module.reader)?;
Ok(Self {
module,
-
types,
func_addrs,
// table_addrs,
@@ -78,17 +92,17 @@ impl<'m, 'data> ModuleInstance<'m, 'data> {
}
impl<'a> Module<'a> {
- pub fn try_new(store: &'a mut Store<'a>, wasm: &'a [u8]) -> Result<Module<'a>> {
+ pub fn try_new(wasm: &'a [u8]) -> Result<Module<'a>> {
let mut validator = Validator::new();
let mut reader = ModuleReader::new();
- for payload in wasmparser::Parser::new(0).parse_all(&wasm) {
+ for payload in wasmparser::Parser::new(0).parse_all(wasm) {
reader.process_payload(payload?, &mut validator)?;
}
if !reader.end_reached {
return Error::other("End not reached");
}
- Ok(Self { store, reader })
+ Ok(Self { reader })
}
}
diff --git a/crates/tinywasm/src/module/reader.rs b/crates/tinywasm/src/module/reader.rs
index 50d1012..13a42a1 100644
--- a/crates/tinywasm/src/module/reader.rs
+++ b/crates/tinywasm/src/module/reader.rs
@@ -151,25 +151,11 @@ impl<'a> ModuleReader<'a> {
Ok(())
}
-
- // fn exports(&mut self) -> Result<Vec<Export>> {
- // let mut exports = Vec::new();
-
- // if let Some(export_section) = self.export_section {
- // for export in export_section.into_iter() {
- // let export = export?;
- // let name = export.name;
- // let kind = export.kind;
- // let index = export.index;
- // exports.push(Export { name, kind, index });
- // }
- // }
-
- // Ok(exports)
- // }
}
-#[derive(Debug)]
+/// A WebAssembly code section
+/// Can be cloned to read functions multiple times
+#[derive(Debug, Clone)]
pub struct CodeSection<'a> {
pub(crate) functions: Vec<FunctionBody<'a>>,
}
diff --git a/crates/tinywasm/src/engine/executer.rs b/crates/tinywasm/src/runtime/executer.rs
index 8b13789..8b13789 100644
--- a/crates/tinywasm/src/engine/executer.rs
+++ b/crates/tinywasm/src/runtime/executer.rs
diff --git a/crates/tinywasm/src/runtime/mod.rs b/crates/tinywasm/src/runtime/mod.rs
new file mode 100644
index 0000000..fe2c6e4
--- /dev/null
+++ b/crates/tinywasm/src/runtime/mod.rs
@@ -0,0 +1,14 @@
+mod executer;
+mod stack;
+mod types;
+
+pub use executer::*;
+pub use stack::*;
+pub use types::*;
+
+/// A WebAssembly Runtime.
+/// See https://webassembly.github.io/spec/core/exec/runtime.html
+#[derive(Debug, Default)]
+pub struct Runtime {
+ pub stack: Stack,
+}
diff --git a/crates/tinywasm/src/engine/stack/call.rs b/crates/tinywasm/src/runtime/stack/call.rs
index 0d0ffae..0d0ffae 100644
--- a/crates/tinywasm/src/engine/stack/call.rs
+++ b/crates/tinywasm/src/runtime/stack/call.rs
diff --git a/crates/tinywasm/src/engine/stack/mod.rs b/crates/tinywasm/src/runtime/stack/mod.rs
index f7ffdf3..f7ffdf3 100644
--- a/crates/tinywasm/src/engine/stack/mod.rs
+++ b/crates/tinywasm/src/runtime/stack/mod.rs
diff --git a/crates/tinywasm/src/engine/types.rs b/crates/tinywasm/src/runtime/types.rs
index ab81b9d..511eac1 100644
--- a/crates/tinywasm/src/engine/types.rs
+++ b/crates/tinywasm/src/runtime/types.rs
@@ -1,8 +1,6 @@
use alloc::{string::String, vec::Vec};
use wasmparser::{FuncType, OperatorsIterator, ValType};
-use crate::module::ModuleInstance;
-
/// A WebAssembly Label
pub struct Label(Addr);
diff --git a/crates/tinywasm/src/store.rs b/crates/tinywasm/src/store.rs
index 3c70c2f..617e9d9 100644
--- a/crates/tinywasm/src/store.rs
+++ b/crates/tinywasm/src/store.rs
@@ -1,38 +1,30 @@
use alloc::vec::Vec;
use wasmparser::FunctionBody;
-use crate::{engine::Engine, module::reader::ModuleReader, Result};
+use crate::{module::reader::ModuleReader, runtime::Runtime, Result};
/// global state that can be manipulated by WebAssembly programs
/// https://webassembly.github.io/spec/core/exec/runtime.html#store
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct Store<'data> {
- pub data: StoreData<'data>,
- pub engine: Engine,
+ pub(crate) data: StoreData<'data>,
+ pub(crate) engine: Runtime,
}
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct StoreData<'data> {
pub funcs: Vec<FunctionBody<'data>>,
// pub tables: Vec<TableAddr>,
// pub mems: Vec<MemAddr>,
// pub globals: Vec<GlobalAddr>,
-}
-
-impl<'data> Default for StoreData<'data> {
- fn default() -> Self {
- Self {
- funcs: Vec::new(),
- // tables: Vec::new(),
- // mems: Vec::new(),
- // globals: Vec::new(),
- }
- }
+ // pub elems: Vec<ElmAddr>,
+ // pub datas: Vec<DataAddr>,
}
impl<'data> Store<'data> {
- pub(crate) fn initialize(&'data mut self, reader: &'data mut ModuleReader) -> Result<()> {
- let code = reader.code_section.take().ok_or_else(|| {
+ /// Initialize the store with global state from the given module
+ pub(crate) fn initialize(&'data mut self, reader: &ModuleReader<'data>) -> Result<()> {
+ let code = reader.code_section.clone().ok_or_else(|| {
crate::Error::Other("Module must have a code section to initialize the store".into())
})?;
@@ -40,12 +32,3 @@ impl<'data> Store<'data> {
Ok(())
}
}
-
-impl Default for Store<'_> {
- fn default() -> Self {
- Self {
- data: StoreData::default(),
- engine: Engine::default(),
- }
- }
-}