summaryrefslogtreecommitdiff
path: root/crates/core
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core')
-rw-r--r--crates/core/Cargo.toml16
-rw-r--r--crates/core/src/error.rs28
-rw-r--r--crates/core/src/instructions.rs106
-rw-r--r--crates/core/src/lib.rs33
-rw-r--r--crates/core/src/module.rs155
-rw-r--r--crates/core/src/std.rs18
6 files changed, 0 insertions, 356 deletions
diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml
deleted file mode 100644
index 2f71aa9..0000000
--- a/crates/core/Cargo.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[package]
-name="tinywasm"
-version="0.0.0"
-edition="2021"
-
-[lib]
-path="src/lib.rs"
-
-[dependencies]
-thiserror={version="1.0", package="thiserror-core", default-features=false}
-wasmparser={version="0.100", package="wasmparser-nostd", default-features=false}
-tracing={version="0.1.38", default-features=false} # logging
-
-[features]
-default=["std"]
-std=["thiserror/std"]
diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs
deleted file mode 100644
index b9c93c4..0000000
--- a/crates/core/src/error.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-use alloc::string::{String, ToString};
-use thiserror::Error;
-
-#[derive(Debug, Error)]
-pub enum Error {
- #[error("error parsing module")]
- ParseError { message: String, offset: usize },
-
- #[error("unknown error: {0}")]
- Other(String),
-}
-
-impl Error {
- pub fn other<T>(message: &str) -> Result<T, Self> {
- Err(Self::Other(message.to_string()))
- }
-}
-
-impl From<wasmparser::BinaryReaderError> for Error {
- fn from(value: wasmparser::BinaryReaderError) -> Self {
- Self::ParseError {
- message: value.message().to_string(),
- offset: value.offset(),
- }
- }
-}
-
-pub type Result<T, E = Error> = crate::std::result::Result<T, E>;
diff --git a/crates/core/src/instructions.rs b/crates/core/src/instructions.rs
deleted file mode 100644
index e3e6a08..0000000
--- a/crates/core/src/instructions.rs
+++ /dev/null
@@ -1,106 +0,0 @@
-// https://webassembly.github.io/spec/core/binary/instructions.html
-
-// Controll Instructions
-pub mod control {
- pub const WASM_UNREACHABLE: u8 = 0x00;
- pub const WASM_NOP: u8 = 0x01; // do nothing
-
- // stuctured instructions
- pub const WASM_BLOCK: u8 = 0x02;
- pub const WASM_LOOP: u8 = 0x03;
- pub const WASM_IF: u8 = 0x04;
-
- pub const WASM_ELSE: u8 = 0x05;
- pub const WASM_END: u8 = 0x0B;
- pub const WASM_BR: u8 = 0x0C;
- pub const WASM_BR_IF: u8 = 0x0D;
- pub const WASM_BR_TABLE: u8 = 0x0E;
- pub const WASM_RETURN: u8 = 0x0F;
- pub const WASM_CALL: u8 = 0x10;
- pub const WASM_CALL_INDIRECT: u8 = 0x11;
- pub const WASM_DROP: u8 = 0x1A;
-}
-
-// Reference Instructions
-pub mod reference {
- pub const WASM_REF_NULL: u8 = 0xD0;
- pub const WASM_REF_IS_NULL: u8 = 0xD1;
- pub const WASM_REF_FUNC: u8 = 0xD2;
-}
-
-// Parametric Instructions
-pub mod parametric {
- pub const WASM_DROP: u8 = 0x1A;
- pub const WASM_SELECT: u8 = 0x1B;
- pub const WASM_SELECT_T: u8 = 0x1C;
-}
-
-// Variable Instructions
-pub mod variable {
- pub const WASM_LOCAL_GET: u8 = 0x20;
- pub const WASM_LOCAL_SET: u8 = 0x21;
- pub const WASM_LOCAL_TEE: u8 = 0x22;
- pub const WASM_GLOBAL_GET: u8 = 0x23;
- pub const WASM_GLOBAL_SET: u8 = 0x24;
-}
-
-// Table Instructions
-pub mod table {
- pub const WASM_TABLE_GET: u8 = 0x25;
- pub const WASM_TABLE_SET: u8 = 0x26;
- pub const WASM_TABLE_INIT: u8 = 0xFC;
- pub const WASM_ELEM_DROP: u8 = 0xFC;
- pub const WASM_TABLE_COPY: u8 = 0xFC;
- pub const WASM_TABLE_GROW: u8 = 0xFC;
- pub const WASM_TABLE_SIZE: u8 = 0xFC;
- pub const WASM_TABLE_FILL: u8 = 0xFC;
-}
-
-// Memory Instructions
-pub mod memory {
- pub const WASM_I32_LOAD: u8 = 0x28;
- pub const WASM_I64_LOAD: u8 = 0x29;
- pub const WASM_F32_LOAD: u8 = 0x2A;
- pub const WASM_F64_LOAD: u8 = 0x2B;
- pub const WASM_I32_LOAD8_S: u8 = 0x2C;
- pub const WASM_I32_LOAD8_U: u8 = 0x2D;
- pub const WASM_I32_LOAD16_S: u8 = 0x2E;
- pub const WASM_I32_LOAD16_U: u8 = 0x2F;
- pub const WASM_I64_LOAD8_S: u8 = 0x30;
- pub const WASM_I64_LOAD8_U: u8 = 0x31;
- pub const WASM_I64_LOAD16_S: u8 = 0x32;
- pub const WASM_I64_LOAD16_U: u8 = 0x33;
- pub const WASM_I64_LOAD32_S: u8 = 0x34;
- pub const WASM_I64_LOAD32_U: u8 = 0x35;
- pub const WASM_I32_STORE: u8 = 0x36;
- pub const WASM_I64_STORE: u8 = 0x37;
- pub const WASM_F32_STORE: u8 = 0x38;
- pub const WASM_F64_STORE: u8 = 0x39;
- pub const WASM_I32_STORE8: u8 = 0x3A;
- pub const WASM_I32_STORE16: u8 = 0x3B;
- pub const WASM_I64_STORE8: u8 = 0x3C;
- pub const WASM_I64_STORE16: u8 = 0x3D;
- pub const WASM_I64_STORE32: u8 = 0x3E;
- pub const WASM_MEMORY_SIZE: u8 = 0x3F;
- pub const WASM_MEMORY_GROW: u8 = 0x40;
- pub const WASM_MEMORY_INIT: u8 = 0xFC;
- pub const WASM_DATA_DROP: u8 = 0xFC;
- pub const WASM_MEMORY_COPY: u8 = 0xFC;
- pub const WASM_MEMORY_FILL: u8 = 0xFC;
-}
-
-// Numeric Instructions
-pub mod numeric {
- // Constants
- pub const WASM_I32_CONST: u8 = 0x41;
- pub const WASM_I64_CONST: u8 = 0x42;
- pub const WASM_F32_CONST: u8 = 0x43;
- pub const WASM_F64_CONST: u8 = 0x44;
-
- // Operations
- pub const START_NUMERIC: u8 = 0x45;
- pub const END_NUMERIC: u8 = 0xC4;
- pub const WASM_SATURATING_TRUNC: u8 = 0xFC;
-}
-
-pub const WASM_VEC: u8 = 0xFD;
diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs
deleted file mode 100644
index 3d572a2..0000000
--- a/crates/core/src/lib.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-#![no_std]
-#![forbid(unsafe_code)]
-#![cfg_attr(not(feature = "std"), feature(error_in_core))]
-
-mod std;
-extern crate alloc;
-
-mod error;
-pub mod instructions;
-pub mod module;
-pub use error::*;
-pub use module::Module;
-
-pub struct Store {}
-
-pub struct Instance {}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use crate::{error::Result, Module};
- use std::dbg;
-
- #[test]
- fn it_works() -> Result<()> {
- let wasm = include_bytes!("../../../examples/wasm/helloworld.wasm");
- let module = Module::new(wasm)?;
-
- dbg!(module);
-
- Ok(())
- }
-}
diff --git a/crates/core/src/module.rs b/crates/core/src/module.rs
deleted file mode 100644
index 1ed42c4..0000000
--- a/crates/core/src/module.rs
+++ /dev/null
@@ -1,155 +0,0 @@
-use crate::error::{Error, Result};
-use alloc::{format, vec::Vec};
-use tracing::error;
-use wasmparser::*;
-
-pub struct Module<'a> {
- reader: ModuleReader<'a>,
-}
-
-impl<'a> core::fmt::Debug for Module<'a> {
- fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
- f.debug_struct("Module")
- .field("version", &self.reader.version)
- .field("type_section", &self.reader.type_section)
- .field("function_section", &self.reader.function_section)
- .field("table_section", &self.reader.table_section)
- .field("memory_section", &self.reader.memory_section)
- .field("global_section", &self.reader.global_section)
- .field("element_section", &self.reader.element_section)
- .field("data_section", &self.reader.data_section)
- .field("code_section", &self.reader.code_section)
- .field("import_section", &self.reader.import_section)
- .field("export_section", &self.reader.export_section)
- .finish()
- }
-}
-
-#[derive(Default)]
-pub struct ModuleReader<'a> {
- pub version: Option<u16>,
- pub type_section: Option<TypeSectionReader<'a>>,
- pub function_section: Option<FunctionSectionReader<'a>>,
- pub table_section: Option<TableSectionReader<'a>>,
- pub memory_section: Option<MemorySectionReader<'a>>,
- pub global_section: Option<GlobalSectionReader<'a>>,
- pub element_section: Option<ElementSectionReader<'a>>,
- pub data_section: Option<DataSectionReader<'a>>,
- pub code_section: Option<CodeSection<'a>>,
- pub import_section: Option<ImportSectionReader<'a>>,
- pub export_section: Option<ExportSectionReader<'a>>,
-}
-
-#[derive(Debug)]
-pub struct CodeSection<'a> {
- pub(crate) functions: Vec<FunctionBody<'a>>,
-}
-
-impl<'a> CodeSection<'a> {
- fn new() -> Self {
- Self {
- functions: Vec::new(),
- }
- }
-}
-
-impl<'a> Module<'a> {
- pub fn new(wasm: &'a [u8]) -> Result<Self> {
- let mut validator = Validator::new();
- let mut reader = ModuleReader::new();
-
- for payload in wasmparser::Parser::new(0).parse_all(wasm) {
- reader.process_payload(payload?, &mut validator)?;
- }
-
- Ok(Self { reader })
- }
-}
-
-impl<'a> ModuleReader<'a> {
- pub fn new() -> Self {
- Self::default()
- }
-
- pub fn process_payload(
- &mut self,
- payload: Payload<'a>,
- validator: &mut Validator,
- ) -> Result<()> {
- use wasmparser::Payload::*;
- match payload {
- Version {
- num,
- encoding,
- range,
- } => {
- validator.version(num, encoding, &range)?;
- self.version = Some(num);
- match encoding {
- wasmparser::Encoding::Module => {}
- wasmparser::Encoding::Component => return Error::other("Component"),
- }
- }
- TypeSection(reader) => {
- validator.type_section(&reader)?;
- self.type_section = Some(reader);
- }
- FunctionSection(reader) => {
- validator.function_section(&reader)?;
- self.function_section = Some(reader);
- }
- TableSection(reader) => {
- validator.table_section(&reader)?;
- self.table_section = Some(reader);
- }
- MemorySection(reader) => {
- validator.memory_section(&reader)?;
- self.memory_section = Some(reader);
- }
- GlobalSection(reader) => {
- validator.global_section(&reader)?;
- self.global_section = Some(reader);
- }
- ElementSection(reader) => {
- validator.element_section(&reader)?;
- self.element_section = Some(reader);
- }
- DataSection(reader) => {
- validator.data_section(&reader)?;
- self.data_section = Some(reader);
- }
- CodeSectionStart { count, range, .. } => {
- validator.code_section_start(count, &range)?;
-
- self.code_section = Some(CodeSection::new());
- }
- CodeSectionEntry(function) => {
- validator.code_section_entry(&function)?;
-
- if let Some(code_section) = &mut self.code_section {
- code_section.functions.push(function);
- } else {
- return Error::other("Empty code section");
- }
- }
- ImportSection(reader) => {
- validator.import_section(&reader)?;
- self.import_section = Some(reader);
- }
- ExportSection(reader) => {
- validator.export_section(&reader)?;
- self.export_section = Some(reader);
- }
-
- End(offset) => {
- validator.end(offset)?;
- return Ok(());
- }
- x => Error::other(&format!("Unknown payload: {:?}", x))?,
- };
-
- error!("Missing end");
-
- Ok(())
- }
-}
diff --git a/crates/core/src/std.rs b/crates/core/src/std.rs
deleted file mode 100644
index 6c112f1..0000000
--- a/crates/core/src/std.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-pub use core::*;
-
-#[cfg(feature = "std")]
-extern crate std;
-
-#[cfg(feature = "std")]
-pub use std::*;
-
-pub mod error {
- #[cfg(feature = "std")]
- extern crate std;
-
- #[cfg(feature = "std")]
- pub use std::error::Error;
-
- #[cfg(not(feature = "std"))]
- pub use core::error::Error;
-}