From 4ab9e569d1ae1c3b13501028ac44b48d30d4a94b Mon Sep 17 00:00:00 2001 From: NikVolf Date: Wed, 29 Mar 2017 18:16:58 +0300 Subject: [PATCH] initial commit --- .gitignore | 2 + Cargo.toml | 7 +++ res/cases/v1/hello.wasm | Bin 0 -> 94842 bytes src/elements/mod.rs | 93 ++++++++++++++++++++++++++++++++++++++++ src/elements/module.rs | 62 +++++++++++++++++++++++++++ src/elements/section.rs | 21 +++++++++ src/lib.rs | 5 +++ 7 files changed, 190 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 res/cases/v1/hello.wasm create mode 100644 src/elements/mod.rs create mode 100644 src/elements/module.rs create mode 100644 src/elements/section.rs create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9d37c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..917bdb4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "parity-wasm" +version = "0.1.0" +authors = ["NikVolf "] + +[dependencies] +byteorder = "1.0" \ No newline at end of file diff --git a/res/cases/v1/hello.wasm b/res/cases/v1/hello.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e0384a0f4e1fae6ec53c7aefad791180a67eb064 GIT binary patch literal 94842 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 SRxB~#{xCb4wqi#(HvT8m-j=Qa literal 0 HcmV?d00001 diff --git a/src/elements/mod.rs b/src/elements/mod.rs new file mode 100644 index 0000000..6a4499d --- /dev/null +++ b/src/elements/mod.rs @@ -0,0 +1,93 @@ +use std::io; + +mod module; +mod section; + +pub use self::module::Module; +pub use self::section::Section; + +use byteorder::{LittleEndian, ByteOrder}; + +pub trait Deserialize : Sized { + type Error; + fn deserialize(reader: &mut R) -> Result; +} + +#[derive(Debug)] +pub enum Error { + UnexpectedEof, + InconsistentLength { expected: usize, actual: usize }, + Other(&'static str), + HeapOther(String), +} + +impl From for Error { + fn from(err: io::Error) -> Self { + Error::HeapOther(format!("I/O Error: {}", err)) + } +} + +struct Unparsed(pub Vec); + +impl Deserialize for Unparsed { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let len = VarUint32::deserialize(reader)?.into(); + let vec = vec![0u8; len]; + Ok(Unparsed(vec)) + } +} + +struct VarUint32(u32); + +impl From for usize { + fn from(var: VarUint32) -> usize { + var.0 as usize + } +} + +impl Deserialize for VarUint32 { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let mut res = 0; + let mut shift = 0; + let mut u8buf = [0u8; 1]; + loop { + reader.read_exact(&mut u8buf)?; + let b = u8buf[0] as u32; + res |= (b & 0x7f) << shift; + shift += 7; + if (b >> 7) == 0 { + break; + } + } + Ok(VarUint32(res)) + } +} + +struct VarUint7(u8); + +impl Deserialize for VarUint7 { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let mut u8buf = [0u8; 1]; + reader.read_exact(&mut u8buf)?; + Ok(VarUint7(u8buf[0])) + } +} + +struct Uint32(u32); + +impl Deserialize for Uint32 { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let mut buf = [0u8; 4]; + reader.read_exact(&mut buf)?; + ; + Ok(Uint32(LittleEndian::read_u32(&buf))) + } +} diff --git a/src/elements/module.rs b/src/elements/module.rs new file mode 100644 index 0000000..942a9f5 --- /dev/null +++ b/src/elements/module.rs @@ -0,0 +1,62 @@ +use std::io; +use super::{Deserialize, VarUint32, Error, Uint32}; +use super::section::Section; + +pub struct Module { + magic: u32, + version: u32, + sections: Vec
, +} + +impl Module { + pub fn version(&self) -> u32 { self.version } +} + +impl Deserialize for Module { + type Error = super::Error; + + fn deserialize(reader: &mut R) -> Result { + let mut sections = Vec::new(); + + let magic = Uint32::deserialize(reader)?; + let version = Uint32::deserialize(reader)?; + + loop { + match Section::deserialize(reader) { + Err(Error::UnexpectedEof) => { break; }, + Err(e) => { return Err(e) }, + Ok(section) => { sections.push(section); } + } + } + + Ok(Module { + magic: magic.0, + version: version.0, + sections: sections, + }) + } +} + +#[cfg(test)] +mod integration_tests { + + use std::io::{self, Read}; + use std::fs::File; + + use super::super::Deserialize; + use super::Module; + + #[test] + fn hello() { + let mut contents = Vec::new(); + File::open("./res/cases/v1/hello.wasm") + .expect("readable file") + .read_to_end(&mut contents) + .expect("read succeeds"); + + let mut reader = io::Cursor::new(contents); + let module = Module::deserialize(&mut reader).expect("Should be deserialized"); + + assert_eq!(module.version(), 1); + } +} \ No newline at end of file diff --git a/src/elements/section.rs b/src/elements/section.rs new file mode 100644 index 0000000..6973d8d --- /dev/null +++ b/src/elements/section.rs @@ -0,0 +1,21 @@ +use std::io; +use super::{Deserialize, Unparsed, Error, VarUint7}; + +pub struct Section { + id: u8, + unparsed: Unparsed, +} + +impl Deserialize for Section { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let id = VarUint7::deserialize(reader)?; + let unparsed = Unparsed::deserialize(reader)?; + + Ok(Section { + id: id.0, + unparsed: unparsed, + }) + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..94e17b6 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,5 @@ +extern crate byteorder; + +mod elements; + +pub use elements::{Section, Module, Error as DeserializeError}; \ No newline at end of file