mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-06-20 10:16:49 +00:00
export section
This commit is contained in:
@ -19,6 +19,9 @@ fn main() {
|
|||||||
&Section::Import(ref import_section) => {
|
&Section::Import(ref import_section) => {
|
||||||
println!("Imports {}", import_section.entries().len());
|
println!("Imports {}", import_section.entries().len());
|
||||||
},
|
},
|
||||||
|
&Section::Export(ref exports_section) => {
|
||||||
|
println!("Exports {}", exports_section.entries().len());
|
||||||
|
},
|
||||||
&Section::Function(ref functions_section) => {
|
&Section::Function(ref functions_section) => {
|
||||||
println!("Functions {}", functions_section.entries().len());
|
println!("Functions {}", functions_section.entries().len());
|
||||||
},
|
},
|
||||||
|
48
src/elements/export_entry.rs
Normal file
48
src/elements/export_entry.rs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
use std::io;
|
||||||
|
use super::{Deserialize, Error, VarUint7, VarUint32};
|
||||||
|
|
||||||
|
pub enum Internal {
|
||||||
|
Function(u32),
|
||||||
|
Table(u32),
|
||||||
|
Memory(u32),
|
||||||
|
Global(u32),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserialize for Internal {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
|
||||||
|
let kind = VarUint7::deserialize(reader)?;
|
||||||
|
match kind.into() {
|
||||||
|
0x00 => Ok(Internal::Function(VarUint32::deserialize(reader)?.into())),
|
||||||
|
0x01 => Ok(Internal::Table(VarUint32::deserialize(reader)?.into())),
|
||||||
|
0x02 => Ok(Internal::Memory(VarUint32::deserialize(reader)?.into())),
|
||||||
|
0x03 => Ok(Internal::Global(VarUint32::deserialize(reader)?.into())),
|
||||||
|
_ => Err(Error::UnknownInternalKind(kind.into())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ExportEntry {
|
||||||
|
field_str: String,
|
||||||
|
internal: Internal,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ExportEntry {
|
||||||
|
pub fn field(&self) -> &str { &self.field_str }
|
||||||
|
pub fn internal(&self) -> &Internal { &self.internal }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserialize for ExportEntry {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
|
||||||
|
let field_str = String::deserialize(reader)?;
|
||||||
|
let internal = Internal::deserialize(reader)?;
|
||||||
|
|
||||||
|
Ok(ExportEntry {
|
||||||
|
field_str: field_str,
|
||||||
|
internal: internal,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -5,10 +5,12 @@ mod section;
|
|||||||
mod primitives;
|
mod primitives;
|
||||||
mod types;
|
mod types;
|
||||||
mod import_entry;
|
mod import_entry;
|
||||||
|
mod export_entry;
|
||||||
|
|
||||||
pub use self::module::Module;
|
pub use self::module::Module;
|
||||||
pub use self::section::Section;
|
pub use self::section::Section;
|
||||||
pub use self::import_entry::{ImportEntry, MemoryType, TableType};
|
pub use self::import_entry::{ImportEntry, MemoryType, TableType, External};
|
||||||
|
pub use self::export_entry::{ExportEntry, Internal};
|
||||||
pub use self::primitives::{VarUint32, VarUint7, VarUint1, VarInt7, Uint32, CountedList};
|
pub use self::primitives::{VarUint32, VarUint7, VarUint1, VarInt7, Uint32, CountedList};
|
||||||
pub use self::types::ValueType;
|
pub use self::types::ValueType;
|
||||||
|
|
||||||
@ -26,6 +28,7 @@ pub enum Error {
|
|||||||
UnknownValueType(i8),
|
UnknownValueType(i8),
|
||||||
NonUtf8String,
|
NonUtf8String,
|
||||||
UnknownExternalKind(u8),
|
UnknownExternalKind(u8),
|
||||||
|
UnknownInternalKind(u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<io::Error> for Error {
|
impl From<io::Error> for Error {
|
||||||
|
@ -9,6 +9,7 @@ use super::{
|
|||||||
ImportEntry,
|
ImportEntry,
|
||||||
MemoryType,
|
MemoryType,
|
||||||
TableType,
|
TableType,
|
||||||
|
ExportEntry,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::types::Type;
|
use super::types::Type;
|
||||||
@ -24,6 +25,7 @@ pub enum Section {
|
|||||||
Function(FunctionsSection),
|
Function(FunctionsSection),
|
||||||
Table(TableSection),
|
Table(TableSection),
|
||||||
Memory(MemorySection),
|
Memory(MemorySection),
|
||||||
|
Export(ExportSection),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deserialize for Section {
|
impl Deserialize for Section {
|
||||||
@ -55,7 +57,10 @@ impl Deserialize for Section {
|
|||||||
},
|
},
|
||||||
5 => {
|
5 => {
|
||||||
Section::Memory(MemorySection::deserialize(reader)?)
|
Section::Memory(MemorySection::deserialize(reader)?)
|
||||||
},
|
},
|
||||||
|
7 => {
|
||||||
|
Section::Export(ExportSection::deserialize(reader)?)
|
||||||
|
},
|
||||||
_ => {
|
_ => {
|
||||||
Section::Unparsed { id: id.into(), payload: Unparsed::deserialize(reader)?.into() }
|
Section::Unparsed { id: id.into(), payload: Unparsed::deserialize(reader)?.into() }
|
||||||
}
|
}
|
||||||
@ -172,6 +177,25 @@ impl Deserialize for MemorySection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct ExportSection(Vec<ExportEntry>);
|
||||||
|
|
||||||
|
impl ExportSection {
|
||||||
|
pub fn entries(&self) -> &[ExportEntry] {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserialize for ExportSection {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
|
||||||
|
// todo: maybe use reader.take(section_length)
|
||||||
|
let _section_length = VarUint32::deserialize(reader)?;
|
||||||
|
let entries: Vec<ExportEntry> = CountedList::deserialize(reader)?.into_inner();
|
||||||
|
Ok(ExportSection(entries))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
@ -306,4 +330,41 @@ mod tests {
|
|||||||
assert_eq!(2, t1.params().len());
|
assert_eq!(2, t1.params().len());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn export_payload() -> Vec<u8> {
|
||||||
|
vec![
|
||||||
|
// section id
|
||||||
|
0x07,
|
||||||
|
// section length
|
||||||
|
148u8, 0x80, 0x80, 0x80, 0x0,
|
||||||
|
// 6 entries
|
||||||
|
134u8, 0x80, 0x80, 0x80, 0x0,
|
||||||
|
// func "A", index 6
|
||||||
|
// [name_len(1-5 bytes), name_bytes(name_len, internal_kind(1byte), internal_index(1-5 bytes)])
|
||||||
|
0x01, 0x30, 0x01, 0x86, 0x80, 0x00,
|
||||||
|
// func "B", index 8
|
||||||
|
0x01, 0x31, 0x01, 0x86, 0x00,
|
||||||
|
// func "C", index 7
|
||||||
|
0x01, 0x32, 0x01, 0x07,
|
||||||
|
// memory "D", index 0
|
||||||
|
0x01, 0x33, 0x02, 0x00,
|
||||||
|
// func "E", index 1
|
||||||
|
0x01, 0x34, 0x01, 0x01,
|
||||||
|
// func "F", index 2
|
||||||
|
0x01, 0x35, 0x01, 0x02
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn export_detect() {
|
||||||
|
let section: Section =
|
||||||
|
deserialize_buffer(export_payload()).expect("section to be deserialized");
|
||||||
|
|
||||||
|
match section {
|
||||||
|
Section::Export(_) => {},
|
||||||
|
_ => {
|
||||||
|
panic!("Payload should be recognized as export section")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,4 +2,10 @@ extern crate byteorder;
|
|||||||
|
|
||||||
mod elements;
|
mod elements;
|
||||||
|
|
||||||
pub use elements::{Section, Module, Error as DeserializeError, deserialize_buffer, deserialize_file};
|
pub use elements::{
|
||||||
|
Section,
|
||||||
|
Module,
|
||||||
|
Error as DeserializeError,
|
||||||
|
deserialize_buffer,
|
||||||
|
deserialize_file
|
||||||
|
};
|
||||||
|
Reference in New Issue
Block a user